将 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";

进行这些更改后,应该只显示组合框列。