• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

[C#]DataGridView中使用数据绑定Enum类型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#类型理解发布时间:2022-07-10
下一篇:
C# 移动无边框的窗体发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap