c#——Winform PropertyGrid使用(二)
PropertyGrid 自定義下拉
首先繪製自定義下拉的控制元件,使用UserControl,當然也可以下拉窗體。
我們這裡使用的 是 UserControl
程式碼如下:
其中最重要的就是要給當前自定義的UserControl 的text 賦值。然後將text值傳遞給PropertyGrid的屬性值using System.Reflection.Emit; using System.Windows.Forms; using System.Windows.Forms.Design; using Jurassic.AdapterConfigCommon.Dialogs; using Microsoft.Practices.CompositeUI.Utility; namespace Jurassic.AdapterConfig.FileEntityRetrieveModule.Views.EntityRetrieveView { public partial class DataSourceControl : UserControl { public DataSourceControl() { InitializeComponent(); } private void tvDataSource_AfterSelect(object sender, TreeViewEventArgs e) { this.Text = e.Node.Text; //選擇之後如何關閉下拉??? } private void llbAddSource_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { var frm = new DataSourceSetView(); if (frm.ShowDialog() == DialogResult.OK) { MessageBox.Show(@"資料來源新增成功!"); this.tvDataSource.Nodes.Add(new TreeNode(frm.DataSourceName)); } } private void tvDataSource_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) { var selectText = e.Node.Text; this.txbDescription.Text = @"當前繫結的資料來源是:" + selectText; } } }
然後就是擴充套件UITypeEditor, 【 提供可用於設計值編輯器的基類,這些編輯器可提供使用者介面 (UI),用來表示和編輯所支援的資料型別的物件值。】
其中就會將上面定義的自定義控制元件作為值編輯器。
擴充套件程式碼如下:
其中最主要的就是using System.Drawing.Design; using System.Windows.Forms.Design; using Jurassic.AdapterConfig.FileEntityRetrieveModule.Views.EntityRetrieveView; namespace Jurassic.AdapterConfig.FileEntityRetrieveModule.Services.Model.CustomEditor { public class PropertyGridDataSource : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; } public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value) { var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (edSvc != null) { var f = new DataSourceControl(); edSvc.DropDownControl(f); value = f.Text; } return value; } public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context) { return false; } } }
<span style="font-size:18px;">UITypeEditorEditStyle.DropDown;</span>
也就是設定編輯器的顯示方式,是下拉的還是模態窗形式的
另外就是,將自定義編輯器的值返回,通過重寫方法editValue
至此擴充套件工作已完成,下面就是具體呼叫了
首先定義一個propertyGrid繫結的類
程式碼如下:
using System; using System.ComponentModel; namespace Services.Model { /// <summary> /// 實體抓取邏輯 DB 配置資訊 /// </summary> public class DbRetrieveConfig { private string _tableName; private string _fieldName; private string _sql; private String _connectionStr = ""; [Editor(typeof(PropertyGridDataSource), typeof(System.Drawing.Design.UITypeEditor)), Description("獲取或設定資料庫連線字串"), Category("實體抓取邏輯(DB Blob)")] public String 資料庫連線 { get { return _connectionStr; } set { _connectionStr = value; } } [Description("獲取或設定表名稱"), Category("實體抓取邏輯(DB Blob)")] public string 表名稱 { get { return _tableName; } set { if (!string.IsNullOrEmpty(value)) { _tableName = value.Trim(); } } } [Description("獲取或設定表字段"), Category("實體抓取邏輯(DB Blob)")] public string 表字段 { get { return _fieldName; } set { if (!string.IsNullOrEmpty(value)) { _fieldName = value.Trim(); } } } [Description("獲取或設定執行的SQL語句"), Category("實體抓取邏輯(DB Blob)"), EditorAttribute(typeof(PropertyGridRichText), typeof(System.Drawing.Design.UITypeEditor))] public string SQL { get { return _sql; } set { if (!string.IsNullOrEmpty(value)) { _sql = value.Trim(); } } } } }
重點是加上屬性標註:
Editor(typeof(PropertyGridDataSource), typeof(System.Drawing.Design.UITypeEditor))
這樣才可以顯示自定的型別
最後繫結到propertyGrid上:
this.propgrdEntityRetrieve.SelectedObject = new DBConn();
接下來看一下效果吧
1.點選下拉框,顯示自定義值編輯器
2.選擇樹節點之後,值傳遞給propertygrid的屬性值的value
相關推薦
C# SQL封裝(二)
c# sql封裝(二)接 C# SQL封裝(一)開始操作數據庫的測試 :using System;using System.Collections.Generic;using System.Linq;using System.Text;using DBDome.com;using DBDome.model;u
C#編程(二)
sys 第一個 hang 都是 names 防止 獲取 括號 賦值 C#中的變量 例如:int i;//聲明一個int類型的變量,變量名是 i;在未為該變量進行賦值操作前,禁止使用該變量.使用(=)給變量賦值,在聲明之後可以 i=10來賦值.也可以在聲明一個變量的同時給它初
C# Stream篇(二) -- TextReader 和StreamReader
ros 開頭 設置 block 哪些 {0} 實例 adt 一點 TextReader 和StreamReader 目錄: 為什麽要介紹 TextReader? TextReader的常用屬性和方法 TextReader 示例 從StreamReader想到多態 簡單介紹下
C++學習筆記(二)——交換函數(swap)
pos 變量 col 值傳遞 一段 turn 如何選擇 ret 原因 這次我們要透過一個簡單的函數swap深入理解函數傳參的本質以及在C++中如何選擇傳參方式。 先來看第一段程序: void swap(int x, int y) { int temp = y;
C#基礎總結(二) —— C#開發工具 Visual Studio(IDE)
暫停 基本上 必備 img 包含 adl 裏的 方案 運行 一、Visual Studio Visual Studio 是微軟公司的一個開發工具集,是C#開發必備利器。下面附上VS2013簡體中文社區版的下載地址: 鏈接:https://pan.baidu.com
用C++畫光(二)——矩形
hub 不能 image trac sample 本地坐標系 AC result bit 在上篇文章的基礎上,做了許多調整,修復了許多BUG。在解決bug的過程中,我逐漸領悟到一個要領:枯燥地一步步調試太痛苦了,找不到問題的根源!所以我選擇將中間結果打到圖片上。如:(註意,
C# 詞法分析器(二)輸入緩沖和代碼定位
自己 ML 轉換 .html 優點 有時 表示 error hub 系列導航 (一)詞法分析介紹 (二)輸入緩沖和代碼定位 (三)正則表達式 (四)構造 NFA (五)轉換 DFA (六)構造詞法分析器 (七)總結 一、輸入緩沖 在介紹如何進行
C++語言學習(二)——C++對C語言基礎語法的擴展
情況下 ces qtcreator 缺少 命令 ast 過多 匯編 lse C++語言學習(二)——C++對C語言基礎語法的擴展 C++是基於C語言擴展發展而來的面向對象的程序設計語言,本文將主要討論C++語言基於C語言擴展的方面。 一、實用性增強 C語言中變量的定義必須在
C++ 學習筆記(二) const的加強
right 變量 pla 實例 編譯器 display 簡介 c語言 style const 含義為只讀。如果在程序中顯式改變const變量那麽編譯會報錯。 C語言的const: 在C語言中const 變量是放在內存中,如果使用指針可以簡介改變const變量。所以在C語
thinking in C++ 讀書日誌(二)
2007-08-01 第二章物件的建立與使用 第二章主要講述c++的一些基礎知識和基本語法,不過我們仍能從書中學到新的東西。這次儘量減小文章的篇幅。主要分兩方面寫:1.推薦知識點,從廣度上覆蓋本章精華;2.對特定某個知識點的進一步研究, 從深度上進行探索。  
C++實現反射(二)
找了一些資料,參考了 C++反射——開源中國 這篇,做了一些修改和簡化,成為了 Version3. 思路其實並不複雜,可以進行反推: 1. 反射是根據類名動態生成類,如果我們有一個全域性的對映關係,可以從類名得到類的相關資訊 ClassInfo,包括類的建構函式,那麼我們便能實現這
SQLite - C/C++介面 API(二)
1、開啟資料庫 SQLITE_API int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */);SQLI
詳解C#泛型(三) 詳解C#泛型(一) 詳解C#泛型(二)
一、前面兩篇文章分別介紹了定義泛型型別、泛型委託、泛型介面以及宣告泛型方法: 詳解C#泛型(一) 詳解C#泛型(二) 首先回顧下如何構建泛型類: public class MyClass<T> { public void MyFunc() {
Golang 通過 cgo 呼叫 C/C++ 靜態庫(二)
書接上回 C 呼叫 C++ 類 Golang 通過 cgo 呼叫 C/C++ 靜態庫(一) 如果想使用 golang 呼叫 C++ 程式碼該如何做? 我們知道,golang 無法直接呼叫 C++,但是可以呼叫 C,所以我們需要用 C 包裝下
C++程式碼閱讀(二)——虛擬函式
C++程式碼閱讀之虛擬函式 virtual bool sendPoseAdjustRequest(int request_code, bool switch_x,bool switch_
C和C++的區別(二)
1、引用 引用就是個別名,記憶體單元的別名,底層以指標的方式來支援引用,在引用使用的地方,系統自帶解引用的過程。 int a = 10; int &b = a; a和b是同一個記憶體塊 引用的注意事項: 引用一定要初始化 引用引用的變數要能取地址 引用是
c++ web service(二)
上一個章節介紹了什麼是web service。這章具體介紹怎麼釋出一個web service,並且呼叫web service。 一、利用編譯工具釋出並呼叫。 1.1 工具介紹:vs2013. 用過vs2017,但提示錯誤,如下圖所示。目前暫未找到解決方法。
C++學習筆記(二):開啟檔案、讀取資料、資料定位與資料寫入
1.開啟二進位制檔案(fopen)、讀取資料(fread),應用示例如下: FILE *fp = fopen("data.yuv", "rb+"); //開啟當前目錄中的data.yuv檔案 char *buffer = ( char*) malloc (sizeof(char)*FrameSi
北京大學MOOC C++學習筆記(二)
類成員的可訪問範圍: 在類的定義中,用下列訪問範圍關鍵字來說明類成員 可被訪問的範圍: – private: 私有成員,只能在成員函式內訪問 – public : 公有成員,可以在任何地方訪問 – protected: 保護成員,以後再說 如過某個成員前面沒有上述關
C#公眾平臺(二)—— 接收事件推送之關注回撥
在C#公眾平臺(一)—— 接入配置 寫了公眾平臺的基本配置,這篇文章講的是關注回撥事件。 基礎幫助類 接收事件推送文件 接入指南 /// <summary> /// WeChatEvent 的摘要說明 /// </summary>