1. 程式人生 > >c#——Winform PropertyGrid使用(二)

c#——Winform PropertyGrid使用(二)

PropertyGrid 自定義下拉

首先繪製自定義下拉的控制元件,使用UserControl,當然也可以下拉窗體。

我們這裡使用的 是 UserControl


程式碼如下:

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;
        }
    }
}
其中最重要的就是要給當前自定義的UserControl 的text 賦值。然後將text值傳遞給PropertyGrid的屬性值

然後就是擴充套件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_

CC++的區別

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>