No tengo la versión VB.Net, pero espero que este fragmento rápido de C# lo ayude o lo guíe en la dirección correcta.
En este ejemplo, configuré un DataGridView simple con 2 columnas. El primero es un DataGridViewComboBox poblado con dos opciones: "Texto" o "Combo".
La segunda columna se establece inicialmente en DataGridViewTextBoxColumn del diseñador.
Manejo el evento CurrentCellDirtyStateChanged en DataGridView. Compruebo si la celda está sucia y solo reviso la primera columna (The ComboBox). Debes llamar al CommitEdit para obtener el nuevo valor en el combo o de lo contrario estarás viendo el valor anterior. En función de la selección en el cuadro combinado, sobrescribo la celda en la segunda columna con una nueva celda de ese tipo.
Agregaría su propia lógica (rellene los menús desplegables y maneje el valor). Es posible que desee almacenar el valor y luego ponerlo de nuevo en la celda o lo que sea.
Aquí está el código que utilicé y de hacer una prueba rápida y sucia en:
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();
}
}
}
Aquí es una traducción rápida VB, que he probado y funciona.
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
Usted perderá cualquier valor almacenado en esa columna, por lo que tendría que guardarlo primero.
Jon
Gracias. Esto es útil. No soy realmente un VB o un.NET experto, así que veo lo que estás haciendo en principio, pero la mecánica de asignar un nuevo DataGridViewTextBoxCell o un nuevo DataGridViewComboBoxCell en VB es algo que todavía tendré que resolver. En cualquier caso, agradezco el tiempo que le dedicas a tu respuesta, y lo intentaré esta tarde. – John
Funciona muy bien. ¡Gracias! – John