我有一个DataGridView
,其列为ComboBox
这是我用来创建列的代码,然后为每一行更新DataSource
。
var dTable = new DataTable();
dTable.Columns.Add("Id",typeof(int));
dTable.Columns.Add("Desc", typeof(string));
for (int i = 0; i < 10; i++)
{
var dRow = dTable.NewRow();
dRow[0] = i;
dRow[1] = "test";
dTable.Rows.Add(dRow);
}
dataGridView1.DataSource = dTable;
//Create the ComboBoxColumn at the end of the grid
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo();
private void UpdateDataSourceCombo()
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"];
//Same datasource for every row just for testing
comboCell.DataSource = new string[] { "a", "b", "c" };
}
}
该列已正确创建为ComboBox
,但它始终为空。
更新 经过进一步测试后,我知道只有当我为整个DGV使用数据源时才会出现问题。
如果我自己创建列,它可以正常工作:
var test = new DataGridViewTextBoxColumn();
test.Name = "asd";
dataGridView1.Columns.Add(test);
dataGridView1.Rows.Add(new DataGridViewRow());
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo(); //Same function as the original post
我使用将数据表加载到网格中的示例更新了原始代码。
答案 0 :(得分:0)
在我的项目上运行如下: 为源数组创建一个类。 将DisplayMemberPath设置为组合框列的ValueMemberPath属性。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace sof
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Data.DataTable dTable = new DataTable();
using (System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=testBase;Integrated security=true"))
{
using (System.Data.SqlClient.SqlDataAdapter sqlAdp = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM City WHERE City_Name LIKE 'Chalon%'", sqlConn))
{
sqlConn.Open();
sqlAdp.Fill(dTable);
}
}
dataGridView1.DataSource = dTable;
//Create the ComboBoxColumn at the end of the grid
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
cmb.DisplayMember = "Display";
cmb.ValueMember = "Value";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo();
}
private void UpdateDataSourceCombo()
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"];
//Same datasource for every row just for testing
if (i % 2 == 0)
comboCell.DataSource = new customObj[] { new sof.customObj("a", "a"), new sof.customObj("b", "b"), new customObj("c", "c") };
else
comboCell.DataSource = new customObj[] { new sof.customObj("1", "1"), new sof.customObj("2", "2"), new customObj("3", "3") };
}
}
}
class customObj
{
public string Value { get; set; }
public string Display { get; set; }
public customObj(string value, string display)
{
this.Value = value;
this.Display = display;
}
}
}