5

Je veux avoir un DataGridView qui a deux colonnes. La première colonne sera toujours de type DataGridViewComboBoxColumn. Sur la base de la sélection dans cette colonne, j'aimerais pouvoir modifier la cellule correspondante dans la deuxième colonne à DataGridViewComboBoxCell ou DataGridViewTextBoxCell.Comment basculer entre DataGridViewTextBoxCell et DataGridViewComboBoxCell?

Je pense que j'ai juste besoin de faire la deuxième colonne de type DataGridViewColumn, mais je ne comprends pas la mécanique de la façon de changer le type de cellule à la volée.

Je travaille avec VB.NET dans Visual Studio 2005.

Merci à l'avance!

Mise à jour: Une façon de contourner, je suppose, est de faire la deuxième colonne comme DataGridViewComboBoxColumn, et modifier les attributs de la cellule afin qu'elle soit se comporte comme une liste déroulante, ou comme (modifiable) déroulant sans éléments. Ce dernier ressemble assez à une boîte de texte que je pourrais vivre avec, et cela n'impliquerait pas de changer le type de la cellule.

Répondre

3

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

+0

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

+0

Fonctionne très bien. Je vous remercie! – John

2

Vous pouvez créer votre propre modèle de cellule qui héberge un contrôle utilisateur. Dans le contrôle utilisateur, vous ajoutez une zone de texte et une zone de liste déroulante et ajoutez une méthode/propriété pour en afficher une et en masquer une autre.

This sample crée une cellule de bouton radio, il n'est pas difficile de modifier le code pour héberger un contrôle utilisateur.

0
dgvCell = new DataGridViewTextBoxCell();   // code to remove checkbox 
     dgvCell.Value = string.Empty; 
     dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;