如何为DataGridView第二列ComboBox绑定枚举?报错‘值无效’
解决DataGridViewComboBoxColumn绑定枚举报错的问题
兄弟,你这代码的问题很明显——你把DataGridViewComboBoxColumn列对象直接当成单元格值塞到行里了,这完全搞错了逻辑!列是DataGridView的结构元素,得先加到列集合里,而单元格的值得是该列数据源里的有效选项,不能是列对象本身。
正确的操作步骤
我给你两种常用的实现方式,选适合你的就行:
方式一:先添加列,再绑定枚举数据源并添加行
如果你的DataGridView还没配置列,先手动添加文本列和ComboBox列,再赋值:
// 1. 添加第一列(文本列,对应你要填的"0") DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn(); idColumn.Name = "IDColumn"; idColumn.HeaderText = "序号"; dataGridView1.Columns.Add(idColumn); // 2. 创建并配置ComboBox列(作为第二列) DataGridViewComboBoxColumn uomComboColumn = new DataGridViewComboBoxColumn(); uomComboColumn.Name = "UomColumn"; uomComboColumn.HeaderText = "单位"; // 用Enum.GetValues绑定枚举值,后续赋值直接用枚举成员(推荐,类型更安全) uomComboColumn.DataSource = Enum.GetValues(typeof(Uom)); // 如果想用枚举名称字符串作为数据源,就换成下面这句: // uomComboColumn.DataSource = Enum.GetNames(typeof(Uom)); // 3. 把ComboBox列加到DataGridView的列集合里 dataGridView1.Columns.Add(uomComboColumn); // 4. 现在添加行,给两列赋值 // 用Enum.GetValues的情况,直接传枚举成员 dataGridView1.Rows.Add("0", Uom.lbs); // 如果用Enum.GetNames的情况,传枚举名称字符串 // dataGridView1.Rows.Add("0", "lbs");
方式二:针对已存在的第二列进行配置
如果你的DataGridView已经有第二列是ComboBox类型,直接给该列设置数据源再赋值:
// 先把第二列转成ComboBox列类型 DataGridViewComboBoxColumn uomColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns[1]; // 绑定枚举数据源 uomColumn.DataSource = Enum.GetValues(typeof(Uom)); // 添加行,给第二列传入枚举有效值 dataGridView1.Rows.Add("0", Uom.not_known);
为什么原来的代码报错?
你之前的datagridview1.Rows.Add(new object[] { "0", dtgcombo})里,dtgcombo是列对象,不是单元格应该接收的有效值——DataGridView的单元格只能接受对应列数据源里的项,比如枚举值或枚举名称字符串,而不能把列本身塞进去,这就会触发"value is not valid"的错误。
内容的提问来源于stack exchange,提问作者G.Lusuegro
相关产品推荐
相关产品推荐

