Frage

Ich möchte ein Datagridview haben, die zwei Spalten. In der ersten Spalte wird immer vom Typ DataGridViewComboBoxColumn sein. Basierend auf der Auswahl in dieser Spalte, würde ich die entsprechende Zelle in der zweiten Spalte in der Lage sein möchte sich ändern entweder eine DataGridViewComboBoxCell oder DataGridViewTextBoxCell.

Ich denke, ich muß nur die zweite Spalte vom Typ Datagridviewcolumn, aber nicht verstehen, die Mechanik, wie im Fluge den Zelltyp zu ändern.

Ich arbeite mit VB.NET in Visual Studio 2005.

Vielen Dank im Voraus!

Update: Ein Weg, um es, glaube ich, ist die zweite Spalte als DataGridViewComboBoxColumn zu machen, und ändern Sie die Attribute der Zelle, so dass es entweder verhält sich wie eine Dropdown-Liste oder als (editierbar) Drop-down ohne Elemente. Letztere sieht genug wie ein Textfeld, dass ich damit leben könnte, und es würde bedeuten, nicht die Art der Zelle zu verändern.

War es hilfreich?

Lösung

Ich habe nicht die VB.Net-Version habe, aber hoffentlich dieser schnelle C # Snippet wird Ihnen helfen, oder Sie in der richtigen Richtung zeigen.

In diesem Beispiel, habe ich eine einfache Datagridview mit 2 Spalten auf. Der erste ist ein DataGridViewComboBox mit zwei Wahlen bevölkert. „Text“ oder „Combo“

Die zweite Säule wird anfänglich auf DataGridViewTextBoxColumn vom Designer.

Ich behandle die CurrentCellDirtyStateChanged Ereignis auf dem Datagridview. Ich überprüfe, ob die Zelle verschmutzt ist und prüfen Sie nur die erste Spalte (Die ComboBox). Du musst die CommitEdit rufen Sie den neuen Wert in der Combo zu bekommen oder sonst werden Sie auf dem vorherigen Wert suchen werden. Basierend auf der Auswahl im Kombinationsfeld überschreibe ich dann die Zelle in der zweiten Spalte mit einer neuen Zelle dieses Typs.

Sie würden Ihre eigene Logik (bevölkern den Drop-downs und den Wert handhaben) hinzuzufügen. Vielleicht möchten Sie den Wert speichern und sie dann in die Zelle zurücklegen oder was auch immer.

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 kurze VB Übersetzung, die 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

Andere Tipps

Sie können Ihre eigene Zelle Vorlage, dass Hosts eine Benutzersteuerung erstellen. In der Benutzersteuerung fügen Sie ein Textfeld und eine Combobox, und fügen Sie eine Methode / Eigenschaft zu zeigen und verbergen andere.

Diese Probe eine Schaltfläche Radio erzeugt Zelle, ist es nicht schwer, den Code zu ändern, um eine Benutzersteuerung zu hosten.

dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top