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

    技术2022-05-19  24

    在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;           }       }    }

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


    最新回复(0)