Question

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, je voudrais être en mesure de changer la cellule correspondante dans la deuxième colonne soit un DataGridViewComboBoxCell ou DataGridViewTextBoxCell.

Je pense que je dois juste faire la deuxième colonne de type DataGridViewColumn, mais ne comprennent pas les mécanismes de la façon de changer le type de cellule à la volée.

Je travaille avec VB.NET dans Visual Studio 2005.

Merci d'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. Celui-ci semble assez comme une zone de texte que je pouvais vivre avec elle, et il ne serait pas impliquer un changement du type de la cellule.

Était-ce utile?

La solution

Je n'ai pas la version VB.Net, mais nous espérons que cet extrait rapide C # vous aider ou vous diriger dans la bonne direction.

Dans cet exemple, je mis en place simple DataGridView 2 colonnes. Le premier est un DataGridViewComboBox peuplé avec deux choix:. « Texte » ou « Combo »

La deuxième colonne est initialement à DataGridViewTextBoxColumn du concepteur.

Je gère l'événement CurrentCellDirtyStateChanged sur le DataGridView. Je vérifie si la cellule est sale et seulement vérifier la première colonne (Le ComboBox). Tu dois appeler le CommitEdit pour obtenir la nouvelle valeur dans le combo ou bien vous serez à la recherche à la valeur précédente. Sur la base de la sélection dans la zone de liste déroulante j'écrasent alors la cellule dans la 2ème colonne avec une nouvelle cellule de ce type.

Vous ajoutez votre propre logique (remplir les bas de chute et de gérer la valeur). Vous pouvez stocker la valeur, puis le remettre dans la cellule ou autre.

Voici le code utilisé et je l'ai fait un test rapide et sale sur:

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

Autres conseils

Vous pouvez créer votre propre modèle de cellule qui héberge un contrôle utilisateur. Dans le contrôle de l'utilisateur que vous ajoutez une zone de texte et un combobox, et ajouter une méthode / propriété pour montrer un et cacher un autre.

Cet exemple crée un bouton radio cellule, il est difficile de ne pas modifier le code pour héberger un contrôle utilisateur.

dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top