Je n'ai pas la version VB.Net, mais j'espère que cet extrait rapide de C# vous aidera ou vous orientera dans la bonne direction.
Dans cet exemple, j'ai configuré un simple DataGridView avec 2 colonnes. Le premier étant un DataGridViewComboBox rempli de deux choix: "Text" ou "Combo".
La deuxième colonne est initialement définie sur DataGridViewTextBoxColumn à partir du concepteur.
Je gère l'événement CurrentCellDirtyStateChanged sur DataGridView. Je vérifie si la cellule est sale et vérifie seulement la première colonne (le ComboBox). Vous devez appeler le CommitEdit pour obtenir la nouvelle valeur dans le combo, sinon vous regarderez la valeur précédente. Basé sur la sélection dans la zone de liste déroulante, puis écraser la cellule dans la 2ème colonne avec une nouvelle cellule de ce type.
Vous ajouteriez votre propre logique (remplissez les listes déroulantes et gérez la valeur). Vous pourriez vouloir stocker la valeur et la remettre dans la cellule ou autre.
Voici le code utilisé et je l'ai fait un test rapide et sale:
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();
}
}
}
Voici une traduction rapide VB, que je l'ai testé et fonctionne.
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
Vous perdrez toute valeur stockée dans cette colonne, vous devrez d'abord l'enregistrer.
Jon
Merci. Ceci est utile Je ne suis pas vraiment un VB ou un.NET expert donc je vois ce que vous faites en principe, mais les mécanismes d'allocation d'un nouveau DataGridViewTextBoxCell ou un nouveau DataGridViewComboBoxCell en VB sont quelque chose que je vais encore devoir comprendre. En tout cas, j'apprécie le temps que vous avez mis dans votre réponse, et je vais essayer cet après-midi. – John
Fonctionne très bien. Je vous remercie! – John