zoukankan      html  css  js  c++  java
  • [C#]DataGridView中使用数据绑定Enum类型

    在Windows Application中,常常会出现使用DataGridView + data binding来维护一组相似数据的例子,例如:

    对于常规类型的变量来说,只需要简单地设置DataGridView的DataSource就可以实现绑定了:

    例如我有一个ColumnConfig的类

        public enum ConfigMode
        {
            Exact,
            Similar,
            Ignore
        }
    
        [XmlType("ColumnConfig")]
        public class ColumnConfig : INotifyPropertyChanged
        {
            [XmlElement]
            public string ColumnName
            {
                get;
                set;
            }
    
            [XmlElement]
            public string Regex
            {
                get;
                set;
            }
            [XmlElement]
            public bool IsNumber
            {
                get;
                set;
            }
            [XmlElement]
            public bool IsOutput
            {
                get;
                set;
            }
    
            public ConfigMode ConfigMode
            {
                get;
                set;
            }
    
            public ColumnConfig()
            {
                this.ColumnName = null;
                IsOutput = true;
                Regex = null;
                IsNumber = false;
                ConfigMode = ConfigMode.Ignore;
            }
    
            public ColumnConfig(string columnName)
            {
                this.ColumnName = columnName;
                IsOutput = true;
                Regex = null;
                IsNumber = false;
                ConfigMode = ConfigMode.Ignore;
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
        }

    在绑定时只需要这样一小段代码:

                        configs = new BindingList<ColumnConfig>();
                        foreach (DataColumn col in dataTable.Columns)
                        {
                            DataGridViewRow dgvr = new DataGridViewRow();
                            ColumnConfig config = new ColumnConfig(col.ColumnName.ToString());
                            configs.Add(config);
                        }
                        grid_ColumnConfigs.DataSource = configs;

    意思就是,只要将DataGridView的DataSource绑定到BindingList<MyClass>上就可以完成这项任务。

    但是当我希望用下拉菜单来表示ColumnConfig中的枚举类型ConfigMode的时候,我们还需要一些额外的工作:

    在Initialize DataGridView之前,你需要做:

                DataGridViewComboBoxColumn myCombo = new DataGridViewComboBoxColumn();
                myCombo.DataSource = new ConfigMode[] { ConfigMode.Exact, ConfigMode.Similar, ConfigMode.Ignore };
                myCombo.HeaderText = "ConfigMode";
                myCombo.Name = "ConfigMode";
                myCombo.ValueType = typeof(ConfigMode);
                myCombo.DataPropertyName = "ConfigMode";
                grid_ColumnConfigs.Columns.Add(myCombo);
                this.grid_ColumnConfigs.DataSource = jobInfo.ColumnConfigs;

    注意:

    1. myCombo.DataSource指的是每一行的下拉菜单中,显示给用户的选项。ValueType很关键,一定要指定是枚举的类型才能实现DataBinding。DataPropertyName就是在ColumnConfig中哪一些属性被绑定到这里。

    2. 我在网上见到有人这么写: myCombo.DataSource = Enum.GetNames(typeof(ConfigMode)); 这个方法的确可以让下拉菜单也显示所有的选项,但是它们是字符串类型的,也就是说没有简单的办法可以让它们变回枚举值!所以你一定会碰到一个叫:“System.Argument.Exception: DataGridViewComboBoxCell value is not valid”的问题。

    3. 解决以上问题的方法有很多种,点名批评以下这种:

    http://blog.csdn.net/cnjack/article/details/4561376

     //处理掉DataGridViewComboBoxColumn绑定数据源后,再绑定到DataTable中的Column时,提示"System.ArgumentException:DagaGridViewComboBoxCell值无效"的错误
     this.dataGridView1.DataError += delegate(object sender, DataGridViewDataErrorEventArgs e) { };

    这种方式只会使出错的弹出窗口不再显示,但是DataBinding是失效的。

    4. 拓展一下:如果你不是想绑定到Enum,而是想绑定到一个自己的Class,那么这个方法适合你:

    http://stackoverflow.com/questions/1503649/problem-when-adding-combobox-to-datagridview

    DataGridViewComboBoxColumn col = new ...
    col.DataSource = columnDataSource;
    col.DisplayMember = "Name";
    col.ValueMember = "Value";
    col.DataPropertyName = "Type";

    综上,只要设置好ValueType就可以解决好Enum的问题。

  • 相关阅读:
    58同城2018提前批前端笔试题总结
    两栏式布局和三栏式布局
    Less学习总结
    网易2018提前批前端笔试编程题
    编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成
    【转】 解释下浏览器是如何判断元素是否匹配某个 CSS 选择器?
    JS数组精简的十三个技巧
    Docker常用命令(命令大全)
    ES6之新的数据结构
    JavaScript高级程序设计(第3版)每章小结(1-5)
  • 原文地址:https://www.cnblogs.com/magicdlf/p/3050237.html
Copyright © 2011-2022 走看看