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

    這樣再將重新包裝的類綁定到下拉列,就可以實現枚舉在列表中的選擇了。

發佈了34 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章