做了一个控件,将Label 和 ComboBox 组合在一起,其中 Label 用于显示标题,ComboBox 与后端数据表的字段相连,显示字段的内容。控件样式如下:
现在合在一起的新控件,有属性 "DataSource" / "DisplayMember" / "ValueMember",该属性与单个控件中的 ComboBox 中对应属性完全相同,希望新控件实例化后与原单独 ComboBox 一样,能有自动的窗体数据源感知和数据表字段感知功能。经过反复测试, DataSource 能感知窗体中的数据源,设定如下:
[Description("数据源"), Category("数据")]
[RefreshProperties(RefreshProperties.Repaint)]
[AttributeProvider(typeof(IListSource))]
public object DataSource
{
get { return this.comboBox1.DataSource; }
set { comboBox1.DataSource = value; }
}
但 DisplayMember / ValueMember 用如下的程序,无法在 DataSource 确定的情况下,自动感知该数据源的字段!!:
[Description("显示的绑定字段"), Category("数据")]
public string DisplayMember
{
get { return this.comboBox1.DisplayMember; }
set { this.comboBox1.DisplayMember = value; }
}
[Description("值的绑定字段"), Category("数据")]
public string ValueMember
{
get { return this.comboBox1.ValueMember; }
set { this.comboBox1.ValueMember = value; }
}
目前错误的效果:
选定 DataSource 后,DisplayMember 没有任何变化,不会出现下拉框。
求助:这个应该如何设计????
谢谢,我已经测试出来了,用如下的办法:
[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 DataField
{
get { return MyLabel.DataField; }
set { MyLabel.DataField = value; }
}
2010以上
[TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
加上这一行
public partial class UserControl1 : BAOLibrary.控件库.控件标题
{
public UserControl1()
{
InitializeComponent();
}
[Description("数据源"), Category("数据")]
[RefreshProperties(RefreshProperties.Repaint)]
[AttributeProvider(typeof(IListSource))]
public object DataSource
{
get { return this.comboBox1.DataSource; }
set { comboBox1.DataSource = value; }
}
[Description("显示的绑定字段"), Category("数据")]
[TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string DisplayMember
{
get { return this.comboBox1.DisplayMember; }
set { this.comboBox1.DisplayMember = value; }
}
[Description("值的绑定字段"), Category("数据")]
[TypeConverterAttribute("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string ValueMember
{
get { return this.comboBox1.ValueMember; }
set { this.comboBox1.ValueMember = value; }
}
}
是这样加吗?不起作用,我用的是 VS2015
再加上
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, " + AssemblyRef.SystemDesign, typeof(System.Drawing.Design.UITypeEditor))]
看ComboBox的定义,需要指定一个Designer,你可以尝试指定System.Windows.Forms.Design.ComboBoxDesigner,如果不行的话,就自己写一个;
// 摘要:
// 表示 Windows 组合框控件。
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[DefaultProperty("Items")]
[DefaultBindingProperty("Text")]
[SRDescription("DescriptionComboBox")]
[DefaultEvent("SelectedIndexChanged")]
[ComVisible(true)]
[Designer("System.Windows.Forms.Design.ComboBoxDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public class ComboBox : ListControl