如何将每行拥有不同ComboBox项的DataTable绑定到DataGridView?
问题原因
你手动创建普通文本列时仅设置了列名和表头文本,未指定DataPropertyName属性与DataTable中的对应字段绑定,导致数据源无法映射到UI列,因此显示为空。
正确实现代码
dataGridView1.AutoGenerateColumns = false; // 普通文本列需显式指定DataPropertyName匹配DataTable的列名 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "String1", HeaderText = "String1", DataPropertyName = "String1" }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "String2", HeaderText = "String2", DataPropertyName = "String2" }); DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn(); comboCol.HeaderText = comboCol.DataPropertyName = comboCol.Name= "combo1"; dataGridView1.Columns.Add(comboCol); bindingSource1.DataSource = CreateDataTable(); dataGridView1.DataSource = bindingSource1; Dictionary<int, List<string>> comboDic = new Dictionary<int, List<string>>() { { 0, new List<string>() { "1", "11", "111" } }, { 1, new List<string>() { "2", "22", "222" } } }; for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { DataGridViewComboBoxCell comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["combo1"]; comboCell.DataSource = comboDic[i]; // 如需设置默认值,必须保证值在当前行的下拉列表范围内 comboCell.Value = comboDic[i][0]; } // 建议在DataTable中新增combo1列,用于存储下拉框选中值,避免值丢失 private DataTable CreateDataTable() { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("String1")); dt.Columns.Add(new DataColumn("String2")); dt.Columns.Add(new DataColumn("combo1")); DataRow dr = dt.NewRow(); dr["String1"] = "a"; dr["String2"] = "aa"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["String1"] = "b"; dr["String2"] = "bb"; dt.Rows.Add(dr); //... return dt; }
额外注意事项
- 如果需要支持用户手动新增行,建议订阅
DataGridView.CellBeginEdit事件,在用户触发下拉编辑时再动态赋值对应行的数据源,适配新增行的场景 - 禁止给ComboBox单元格设置不在当前行数据源列表内的值,否则会抛出值无效异常
内容的提问来源于stack exchange,提问作者tp1415926535
相关产品推荐
相关产品推荐

