У меня нет версии VB.Net, но, надеюсь, этот быстрый фрагмент C# поможет вам или направит вас в правильном направлении.
В этом примере я создал простой DataGridView с двумя столбцами. Первый из них - DataGridViewComboBox, заполненный двумя вариантами: «Текст» или «Комбо».
Второй столбец изначально установлен в DataGridViewTextBoxColumn из конструктора.
Я обрабатываю событие CurrentCellDirtyStateChanged в DataGridView. Я проверяю, загрязнен ли элемент и проверяет только первый столбец (ComboBox). Вы должны вызвать 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
End Class
Вы потеряете значение, сохраненное в этом столбце, так что вам нужно будет, чтобы сохранить его первым.
Jon
Спасибо. Это полезно. Я не действительно VB или.NET, поэтому я вижу, что вы делаете в принципе, но механика выделения нового DataGridViewTextBoxCell или нового DataGridViewComboBoxCell в VB - это то, что мне еще предстоит выяснить. В любом случае я ценю время, которое вы вложили в свой ответ, и я попробую это сегодня днем. – John
Отлично работает. Спасибо! – John