none
在设计器中,如何为自定义控件的某个属性动态生成值列表? RRS feed

  • 问题

  • 想要实现这样的一个自定义控件:为控件添加一个数据源后,能自动的把这个数据源的列名添加到列名列表属性中,现在能实现在列名属性中选择已经定义好的列名,但不如如何才能动态的添加数据源的列名?谢谢

            [Description("设置DataGridView绑定数据源")]
            [DefaultValue(null)]
            [Category("Data")]   
            public BindingSource DataGridViewDataSource
            {
                get { return m_dgvBindingSource; }
                set
                {
                    if (value != null)
                    {
                       m_dgvBindingSource = value;
                      // AddFields();
                    }
                }
            }

     

           [Description("设置字段")]
            [DefaultValue(null)]
            [TypeConverter(typeof(FieldConverter))]
            [Category("Data")]
            public string SearchField
            {
                get { return m_searchField; }
                set { m_searchField = value; }
            }

     

             internal class FieldConverter : StringConverter
            {
                public static StandardValuesCollection defaultFields = new StandardValuesCollection(new string[] { "ID", "Name" });;

                public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
                {
                    return true;
                }

                public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
                {
                    return false;
                }

                public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
                {
                   
                    return defaultFields;
                }

            }

     

       

    2008年11月19日 8:14

答案

  •  

    实现GetStandardValues方法, 返回集合, 如下是一个例子:

     

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)

            {

                string[] strArray = new string[] { "水果", "蔬菜", "肉食", "面食", "蛋类" };

                StandardValuesCollection returnStandardValuesCollection = new StandardValuesCollection(strArray);

                return returnStandardValuesCollection;

            }

     

     

    把strArray数组替换成你的动态数据源列值即可.

     

     

     

    2008年11月19日 12:25
    版主

全部回复

  •  

    实现GetStandardValues方法, 返回集合, 如下是一个例子:

     

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)

            {

                string[] strArray = new string[] { "水果", "蔬菜", "肉食", "面食", "蛋类" };

                StandardValuesCollection returnStandardValuesCollection = new StandardValuesCollection(strArray);

                return returnStandardValuesCollection;

            }

     

     

    把strArray数组替换成你的动态数据源列值即可.

     

     

     

    2008年11月19日 12:25
    版主
  • 呵呵,非常感谢,现在的问题是:设置数据源后,如何才能吧数据源的列值填充到上面的strArray数据中?

    2008年11月20日 2:53
  • 问题已经解决

            [Category("DataGridView")]
            [Description("设置搜索的字段")]
            [DefaultValue(null)]
            [TypeConverter(typeof(FieldConverter))]
            public string SearchField
            {
                get { return m_searchField; }
                set
                {
                    FillFields();
                    m_searchField = value;
                }
            }

     

          在FillFields()函数中把数据源的列名添加到strArray数据中就行了。

    2008年11月21日 2:22