将 Data Table 中的 int 列替换为 DataGridView (Winforms) 的组合框
Replace int column in Data Table with combobox for DataGridView (Winforms)
我有一个带有一些整数值的数据表(假设 0 => 'open'、1 => 'proceeding'、2 => 'free' 等)并且在我想要的 dgv 中允许用户更改该值,但使用组合框和字符串值。所以我创建了一个简单的 winform 应用程序来测试它
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("test");
dt.Rows.Add(1);
dt.Rows.Add(2);
DataTable source = new DataTable();
source.Columns.AddRange(new DataColumn[] { new DataColumn("Value", typeof(int)), new DataColumn("Display", typeof(string)) });
source.Rows.Add(0, "zero");
source.Rows.Add(1, "one");
source.Rows.Add(2, "two");
dataGridView1.DataSource = dt;
var testTextColumn = new DataGridViewComboBoxColumn();
testTextColumn.HeaderText = "Text";
testTextColumn.Name = "testText";
testTextColumn.DataSource = source;
testTextColumn.DisplayMember = "Display";
testTextColumn.ValueMember = "Value";
dataGridView1.Columns.Add(testTextColumn);
}
到目前为止一切顺利,我想我可以简单地让测试列不可见,只让 testText 列可见(在最终应用程序中),但是如何组合 to 值,即当我在cb 更新数据表的值?我可以通过 changeEvents 做到这一点,但这似乎很不切实际。有某种数据绑定吗?
创建一个单元格更改事件,然后获取您更改的行号并且您可以访问具有索引的列...
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.CurrentRow != null)
{
DataGridViewRow dgvRow = dataGridView1.CurrentRow;
// do what u want here like
int teste = Convert.ToInt32(dgvRow.Cells[1].Value);
}
}
为了实现您所描述的内容,您发布的代码中存在三 (3) 处错误。
1-代码行…
dt.Columns.Add("test");
… 默认为 string
值。因此,当您尝试从 source
table 绑定“值”列时,组合框会抛出 DataError
。因此,您需要在数据中指定 int
类型的列。喜欢……
dt.Columns.Add("test", typeof(int));
2- 在代码设置网格 DataSource
之前,代码需要指定我们不希望网格为 AutoGenerateColumns
。否则,我们将得到两列。此外,此网格 属性 未在“设计器”中显示 属性。您需要在添加数据源之前设置此 属性,并且需要在您的代码中设置此 属性。像……
dataGridView1.AutoGenerateColumns = false;
3- 当代码创建组合框列时,它永远不会识别我们要将组合框列绑定到网格中的“哪个”列 DataSource
。这就是列 DataPropertyName
的目的。因此,您需要在组合框定义中添加这行代码...
testTextColumn.DataPropertyName = "test";
进行这些更改后,应该只显示组合框列。
我有一个带有一些整数值的数据表(假设 0 => 'open'、1 => 'proceeding'、2 => 'free' 等)并且在我想要的 dgv 中允许用户更改该值,但使用组合框和字符串值。所以我创建了一个简单的 winform 应用程序来测试它
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("test");
dt.Rows.Add(1);
dt.Rows.Add(2);
DataTable source = new DataTable();
source.Columns.AddRange(new DataColumn[] { new DataColumn("Value", typeof(int)), new DataColumn("Display", typeof(string)) });
source.Rows.Add(0, "zero");
source.Rows.Add(1, "one");
source.Rows.Add(2, "two");
dataGridView1.DataSource = dt;
var testTextColumn = new DataGridViewComboBoxColumn();
testTextColumn.HeaderText = "Text";
testTextColumn.Name = "testText";
testTextColumn.DataSource = source;
testTextColumn.DisplayMember = "Display";
testTextColumn.ValueMember = "Value";
dataGridView1.Columns.Add(testTextColumn);
}
到目前为止一切顺利,我想我可以简单地让测试列不可见,只让 testText 列可见(在最终应用程序中),但是如何组合 to 值,即当我在cb 更新数据表的值?我可以通过 changeEvents 做到这一点,但这似乎很不切实际。有某种数据绑定吗?
创建一个单元格更改事件,然后获取您更改的行号并且您可以访问具有索引的列...
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.CurrentRow != null)
{
DataGridViewRow dgvRow = dataGridView1.CurrentRow;
// do what u want here like
int teste = Convert.ToInt32(dgvRow.Cells[1].Value);
}
}
为了实现您所描述的内容,您发布的代码中存在三 (3) 处错误。
1-代码行…
dt.Columns.Add("test");
… 默认为 string
值。因此,当您尝试从 source
table 绑定“值”列时,组合框会抛出 DataError
。因此,您需要在数据中指定 int
类型的列。喜欢……
dt.Columns.Add("test", typeof(int));
2- 在代码设置网格 DataSource
之前,代码需要指定我们不希望网格为 AutoGenerateColumns
。否则,我们将得到两列。此外,此网格 属性 未在“设计器”中显示 属性。您需要在添加数据源之前设置此 属性,并且需要在您的代码中设置此 属性。像……
dataGridView1.AutoGenerateColumns = false;
3- 当代码创建组合框列时,它永远不会识别我们要将组合框列绑定到网格中的“哪个”列 DataSource
。这就是列 DataPropertyName
的目的。因此,您需要在组合框定义中添加这行代码...
testTextColumn.DataPropertyName = "test";
进行这些更改后,应该只显示组合框列。