我没有 VB.Net 版本,但希望这个快速的 C# 代码片段能够帮助您或为您指明正确的方向。
在此示例中,我设置了一个包含 2 列的简单 DataGridView。第一个是 DataGridViewComboBox,填充有两个选项:“文本”或“组合”。
第二列最初由设计器设置为 DataGridViewTextBoxColumn。
我处理 DataGridView 上的 CurrentCellDirtyStateChanged 事件。我检查单元格是否脏,只检查第一列(组合框)。您必须调用 CommitEdit 来获取组合中的新值,否则您将看到以前的值。然后,根据组合框中的选择,我用该类型的新单元格覆盖第二列中的单元格。
您可以添加自己的逻辑(填充下拉列表并处理值)。您可能想要存储该值,然后将其放回单元格或其他位置。
这是我使用的代码,并对其进行了快速而肮脏的测试:
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty == false)
{
return;
}
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
if (((string)dataGridView1.CurrentCell.Value) == "Text")
{
dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell();
}
else if (((string)dataGridView1.CurrentCell.Value) == "Combo")
{
dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell();
}
}
}
这是一个快速的 VB 翻译,我已经测试过并且可以工作。
Public Class Form1
Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
If DataGridView1.IsCurrentCellDirty = False Then
Return
End If
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
If DataGridView1.CurrentCell.ColumnIndex = 0 Then
If CStr(DataGridView1.CurrentCell.Value) = "Text" Then
DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell
ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then
DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell
End If
End If
End Sub
结束课程
您将丢失该列中存储的任何值,因此您需要先保存它。
Jon