5

Ich möchte ein DataGridView mit zwei Spalten haben. Die erste Spalte wird immer vom Typ DataGridViewComboBoxColumn sein. Basierend auf der Auswahl in dieser Spalte möchte ich die entsprechende Zelle in der zweiten Spalte entweder in eine DataGridViewComboBoxCell oder eine DataGridViewTextBoxCell ändern können.Wie wird zwischen DataGridViewTextBoxCell und DataGridViewComboBoxCell gewechselt?

Ich denke, ich muss nur die zweite Spalte des Typs DataGridViewColumn machen, aber verstehe nicht die Mechanik, wie Sie den Zelltyp im laufenden Betrieb ändern.

ich mit VB.NET in Visual Studio 2005.

Vielen Dank im Voraus zu arbeiten!

Update: Ein Weg, um es, glaube ich, ist die zweite Spalte als DataGridViewComboBoxColumn zu machen, und die Attribute der Zelle zu ändern, so dass es entweder wie eine Dropdown-Liste verhält, oder als (editierbare) Drop-Down ohne Elemente. Letzteres sieht aus wie eine Textbox, mit der ich leben könnte, und es würde nicht bedeuten, den Typ der Zelle zu ändern.

Antwort

3

Ich habe nicht die VB.Net-Version, aber hoffentlich hilft Ihnen dieses schnelle C# -Snippet oder weist Sie in die richtige Richtung.

In diesem Beispiel habe ich eine einfache DataGridView mit 2 Spalten eingerichtet. Die erste ist eine DataGridViewComboBox, die mit zwei Auswahlmöglichkeiten gefüllt ist: "Text" oder "Combo".

Die zweite Spalte wird anfänglich vom Designer auf DataGridViewTextBoxColumn gesetzt.

Ich handle das CurrentCellDirtyStateChanged-Ereignis auf der DataGridView. Ich überprüfe, ob die Zelle schmutzig ist und überprüfe nur die erste Spalte (die ComboBox). Sie müssen den CommitEdit aufrufen, um den neuen Wert in der Combo zu erhalten, sonst sehen Sie sich den vorherigen Wert an. Aufgrund der Auswahl in der Combo-Box überschreibe ich dann die Zelle in der 2. Spalte mit einer neuen Zelle dieses Typs.

Sie würden Ihre eigene Logik hinzufügen (füllen Sie die Dropdown-Menüs und behandeln Sie den Wert). Vielleicht möchten Sie den Wert speichern und dann in die Zelle oder was auch immer zurücklegen. Hier

ist der Code, den ich verwenden und habe einen schnellen und schmutzigen Test auf:

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(); 
      } 
     } 
    } 

Hier ist eine schnelle VB Übersetzung ist, dass ich getestet und funktioniert.

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

Sie einen beliebigen Wert in dieser Spalte gespeichert verlieren, so dass Sie es zuerst speichern müssten.

Jon

+0

Vielen Dank. Dies ist hilfreich. Ich bin nicht wirklich ein VB oder ein.NET-Experte, also sehe ich, was Sie im Prinzip tun, aber die Mechanik des Zuweisens einer neuen DataGridViewTextBoxCell oder einer neuen DataGridViewComboBoxCell in VB bin etwas, das ich noch herausfinden muss. Auf jeden Fall schätze ich die Zeit, die Sie in Ihre Antwort gesteckt haben, und ich werde es heute Nachmittag versuchen. – John

+0

Funktioniert gut. Vielen Dank! – John

2

Sie können Ihre eigene Zellenvorlage erstellen, die ein Benutzersteuerelement hostet. Im Benutzersteuerelement fügen Sie ein Textfeld und eine Combobox hinzu und fügen eine Methode/Eigenschaft hinzu, um eine anzuzeigen und eine andere auszublenden.

This sample erstellt eine Radio-Button-Zelle, ist es nicht schwer, den Code zu ändern, um ein Benutzersteuerelement zu hosten.

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