用户控件的数据源

Kha*_*aji 8 .net c# custom-controls winforms

我正在建立一个用户控件.目前它由一个文本框和一个按钮组成 - 作为一种学习体验.这将用作更有用的控制的基础.

我想添加一个DataSource,显示成员和ValueMember.
这是我的数据源代码.它将显示在"属性"编辑器中,但已禁用并显示为灰色.我错过了什么?

    private object MyDataSource;

    [Browsable(true)]
    [TypeConverter("System.Windows.Forms.Design.DataSourceConverter")]
    [System.ComponentModel.Bindable(true)]
    public object DataSource
    {
        get
        {
            return MyDataSource;
        }
        set
        {
            if (MyDataSource != value)
                MyDataSource = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

更简单的选择可能是使用属性提供程序:

[AttributeProvider(typeof(IListSource))]
Run Code Online (Sandbox Code Playgroud)

您可以尝试使用程序集限定名称吗?并指定编辑器?

[TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
Run Code Online (Sandbox Code Playgroud)

实际上,只需指定程序集,就可以将其缩写为与版本无关:

[TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")]
[Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design", typeof(UITypeEditor))]
Run Code Online (Sandbox Code Playgroud)


Tal*_*wer 5

我将 ComplexBindingProperties 属性添加到我的 Control 类中,并将 AttributeProvider 添加到我的 DataSource 属性中

[ComplexBindingProperties("DataSource", "DataMember")]
public partial class SomeListControl : UserControl
Run Code Online (Sandbox Code Playgroud)

...

[Category("Data")]
[Description("Indicates the source of data for the control.")]
[RefreshProperties(RefreshProperties.Repaint)]
[AttributeProvider(typeof(IListSource))]
public object DataSource
{
    get { return _ultraGrid.DataSource; }
    set { _ultraGrid.DataSource = value; }
}

[Category("Data")]
[Description("Indicates a sub-list of the data source to show in the control.")]
[Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor))]    
public string DataMember
{
    get
    {
        return _ultraGrid.DataMember;
    }

    set
    {
        _ultraGrid.DataMember = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

参考:在 Windows 窗体控件中应用属性