如何在DataGridViewComboBoxCell中选择一个值?

时间:2012-07-25 19:40:36

标签: c# winforms datagridview

我有DataGridViewComboBoxCell和DataTable。表I中的数据使用DataSource与DataGridViewComboBoxCell绑定,并设置ValueMember和DisplayMember。

private void Form1_Load(object sender, EventArgs e)
{         
    DataGridViewComboBoxCell comboBoxCell = new DataGridViewComboBoxCell();

    dataGridView1.Rows[0].Cells[0] = comboBoxCell;

    comboBoxCell.DataSource = dataTable;
    comboBoxCell.ValueMember = "ID";
    comboBoxCell.DisplayMember = "Item";
}

如何在表单加载时以编程方式设置单元格中的值? 在简单的ComboBox中,我知道一个属性SelectedIndex。 我试过comboBoxCell.Value = ...;但它给了一个例外。 并试过

private void dataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e)
{
    e.Value = 1;
}

它在单元格中设置一个新值,但我需要选择一个值。

表单已加载,我有空单元格。

Form loaded and I have empty cell.

ComboBox中的一些数据。

And some data in the ComboBox.

当我在comboBoxCell.DisplayMember = ...(见上文)之后立即放置此代码dataGridView1.Rows[0].Cells["ComboColumn"].Value = "1";时,它可以正常工作。

ID列中的值“1”对应于Items列中的值“Second”。因此,我得到了正确的结果。

The value "1" in the ID column corresponds to the value "Second" in the Items column.So, I get the correct result.

抱歉我的英文和我的新手代码:)

1 个答案:

答案 0 :(得分:16)

不是在网格中添加单元格,而是添加DataGridViewComboBox列。

DataGridViewComboBoxColumn c = new DataGridViewComboBoxColumn();
c.Name = "ComboColumn";
c.DataSource = dataTable;
c.ValueMember = "ID";
c.DisplayMember = "Item";
dataGridView1.Columns.Add(c);

要选择特定值,请设置给定单元格的Value属性。

dataGridView1.Rows[rowIndexYouWant].Cells["ComboColumn"].Value = 1;
  • 请注意,此处的类型很重要!在评论中,你说你得到System.FormatException。这可能是由于将错误的类型设置为值而引起的。

    当你将值设置为1时,你正在分配一个int - 如果由于某种原因你在ID列中有字符串,你将得到你所看到的System.FormatException异常。

    如果类型不同,则需要更新DataTable定义或将值设置为字符串:

    dataGridView1.Rows[rowIndexYouWant].Cells["ComboColumn"].Value = "1";
    
  • 另请注意,在您设置为网格源的DataTable的ID列中,此值必须存在

设置DataSource时,通常最容易使用DataGridView。在这种情况下,您可以使用DataPropertyName属性将ComboBoxColumn绑定到网格的DataSource。

c.DataPropertyName = "GridDataSourceColumnName";

这允许从网格数据源获取列值,并对列进行更改以直接更改该数据源。


最后,请勿在此处使用CellFormatting事件 - 此事件不适用于此类用途。通常最好在DataBindingComplete事件中执行此类工作(如果您只需要执行一次),或者在需要DefaultValues或RowValidating的某些事件中执行此类工作。

通过使用CellFormatting,您可能无法手动编辑组合框。