[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的问题。

 

 

 

posted @ 2013-04-29 00:35  magicdlf  阅读(2871)  评论(0编辑  收藏  举报