首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinForms 自訂控件實現 DisplayMember 自動感知 DataSource 字段

     編輯:程式設計綜合問答

問題描述

開發一個包含 Label 與 ComboBox 的複合控件,透過公開 DataSource、DisplayMember、ValueMember 屬性內部轉發給 ComboBox。DataSource 已能在設計時自動感知表單上的資料來源,但 DisplayMember 與 ValueMember 無法在設定 DataSource 後自動列出該資料來源的欄位名稱(缺少下拉選單)。

根本原因

原生 ComboBox 的 DisplayMember / ValueMember 屬性標註了 [TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter")] 與 [Editor("System.Windows.Forms.Design.DataMemberFieldEditor")],這兩個設計時期類別會讀取 DataSource 並解析欄位。自訂控件若直接包裝字串屬性,缺少這兩個屬性,設計器無法提供欄位選單。

解決方案:複製原生屬性標註

[Description("顯示的綁定字段"), Category("數據")]
[TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public string DisplayMember
{
    get { return comboBox1.DisplayMember; }
    set { comboBox1.DisplayMember = value; }
}

[Description("值的綁定字段"), Category("數據")]
[TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public string ValueMember
{
    get { return comboBox1.ValueMember; }
    set { comboBox1.ValueMember = value; }
}

關鍵點

  • TypeConverter:負責將欄位名稱列表轉換為下拉選單項目。
  • Editor:提供設計時的下拉編輯器 UI。
  • 組件名稱 System.Design 版本號與 PublicKeyToken 必須與目標 .NET Framework 版本一致(上例為 4.0)。

驗證結果

重新建置專案,拖放控件至表單,設定 DataSource 後,DisplayMember 屬性下拉即可顯示該資料來源的所有欄位名稱,行為與原生 ComboBox 完全一致。

補充建議

  • 若控件針對 .NET Core / .NET 5+,組件名稱改為 System.Windows.Forms.Design,版本號對應調整。
  • 若需支援巢狀物件路徑(如 Customer.Address.City),原生轉換器已內建支援,無需額外代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved