開發一個包含 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; }
}
System.Design 版本號與 PublicKeyToken 必須與目標 .NET Framework 版本一致(上例為 4.0)。重新建置專案,拖放控件至表單,設定 DataSource 後,DisplayMember 屬性下拉即可顯示該資料來源的所有欄位名稱,行為與原生 ComboBox 完全一致。
System.Windows.Forms.Design,版本號對應調整。Customer.Address.City),原生轉換器已內建支援,無需額外代碼。