在Datagridview控件利用下拉菜单进行枚举数据输入

在Datagridview控件利用下拉菜单进行数据输入可以使用户操作更加方便,在配置COMBOX控件时,只要设置了datasource, displaymember,valuemember,即可实现comboxbox的数据输入,如:

  有一个类如下:

    public class Class1
    {
        string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        int _Weight;

        public int Weight
        {
            get { return Weight; }
            set { Weight = value; }
        }

    }

  如果存在集合List<Class1> P1

  定义一个Combobox1.DataSource= P1;

          Combobox1.DisplayMember="Name";

          ComboBox1.ValueMember="Weight";

   这样,在获取Combobox1.SelectedItem时,获取的是对象的Weight值,

  而如果将combobox的datasource绑定一个枚举enmu的话,不用设置displaymember及valuemember即可通过selectedItem获得枚举值。

 

  对于一个列表控件Dgv_ClassTest,要添加DataGridViewComboBoxColumns,也可以采用同样方法,如将下拉菜单了的数据源对应valuememeber设为Class1,则该列添加的单元格的类型也必须是Class1类型,因此我们要对原有的Class1进行一下改造:

    public class Class1
    {
        string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        int Weight;

        public int Weight1
        {
            get { return Weight; }
            set { Weight = value; }
        }
        public Class1 Class1
        {
            get
            {
                return This;
            }
        }

    }

 

   这样在选中一项纪录时,就可以按如下方式配置列:

   CmbCol.DataSource=P1;

   CmbCol.DisPlayMember=="Name";

   CmbCol.ValueMember="Class1";

   假设存在一个类如下:

    public class Class2
    {
        private Class1 _C1;

        public Class1 C1
        {
            get { return _C1; }
            set { _C1 = value; }
        }
        private string _Name;
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }
    }

    有一个该类的集合BindingList<Class2> P2对列表进行绑定

    Dgv_ClassTest.Datasource=P2;

    CmbCol.DataBoundItem="C1";

    NameCol.DataBoundItem="Name";

    这样P2集合就可以通过列表控件进行数据的输入输出了。

   但对于枚举,因为无法设置DisplayMember和ValueMember, 因此绑定时会报值无效的错误,网上国内国外的帖子的解决方法都是重写dataerorr事件,当这是个馊主意,因为异常发生了,就得解决,抛出去不理怎们行,况且这样简单抛掉,其他错误也会抛掉,反而不利于排错。

  我的解决方法是,将枚举重新打包成一个新的静态类,比如,我们将KnownColor枚举包装如下:

  public  class MyKnownColor
    {
       private KnownColor _color;
       private static List<MyKnownColor> _ColorList;

       public static List<MyKnownColor> ColorList
            {
                get
                {
                    if (_ColorList == null)
                    {
                        _ColorList = new List<MyKnownColor>();
                        Array xx = Enum.GetValues(typeof(KnownColor));
                        MyKnownColor p = null;
                        foreach (KnownColor x in xx)
                        {
                            p = new MyKnownColor(x);
                            ColorList.Add(p);
                        }
                    }
                    return MyKnownColor._ColorList;
                }
            }

            public MyKnownColor  Color
            {
                get { return this ; }
            }
            private  MyKnownColor(KnownColor c)
            {

                _color = c;
            }

          public  string Name
            {
                get
                {
                    return _color.ToString();
                }
            }
       public KnownColor KnownColor
       {
           get
           {
               return _color;
           }
       }
       public int Index
       {
           get
           {
               return _color.GetHashCode()-1;
           }
       }
    }

    这样再将重新包装的类绑定到下拉列,就可以实现枚举在列表中的选择了。

posted @ 2011-03-05 19:00  窗户纸  阅读(384)  评论(0编辑  收藏  举报