2016-07-11 13 views
1

Ich habe eine Datagridview mit 2 Spalten als Combobox und ich möchte die zweite je nach der ersten füllen.Füllung ComboBox Spalte in DatagridView VB.Net

Ex. Ich habe eine Tabelle in meiner Datenbank mit Stationen

TableStations 
Station 1 
Station 2 

und jeder Sender hat eine unterschiedliche Menge an Ausgaben

Ex.

Station 1  Station 2 
OutP1   OutP5 
OutP2   OutP6 
       OutP7 

Was will ich in der Datagridview tun, ist, dass, wenn der Benutzer von der ersten Combobox wählt eine Station die nächste Combobox mit den Ausgängen für diese Station gefüllt wird, mein Problem kommt, wenn der Benutzer eine zweite Reihe fügt in datagridview Wenn er eine andere Station auswählt, wird die Information in der ersten Zeile geändert.

Gibt es eine Lösung für diese oder jede andere Art zu tun, was ich will?

Vielen Dank im Voraus

EDIT: Dies ist der Code im

   Con.Open() 
       cmd.Parameters.Clear() 
       With cmd 
        .CommandText = "Select output From List_outputs where [email protected]"    
        .Parameters.AddWithValue("@station", datagridview1.Item(0, e.RowIndex).Value) 
        .Connection = Con 
        reader = .ExecuteReader 
       End With 
       combobox2.Items.Clear() 
       While reader.Read 
        combobox2.Items.Add(reader("output ")) 
       End While 
       reader.Close() 

Dieser Code ist unter dem Cellclick-Ereignisse meiner Datagridview verwenden.

+1

Es klingt wie Sie die gleiche Instanz als Datenquelle für sie verwenden. Schwer zu sagen ohne Code. – Plutonix

+0

Ich habe den Code, dass ich mit –

+0

hinzugefügt Ich habe Angst, dass, was ich dachte, würde tatsächlich funktionieren nicht. Ich bin mir sicher, dass es getan werden kann, aber ich habe keine Zeit, um die Details jetzt zu erarbeiten, also habe ich meine unvollständige Antwort entfernt. – jmcilhinney

Antwort

0

Dies ist ein bisschen schwierig, da Sie die Datenquelle der Spalte nicht festlegen können. Das Festlegen der Datenquelle der Spalte wirkt sich auf die gesamte Spalte aus. Sie müssen die Datenquelle jeder Zelle separat festlegen. Ich zeige dir, wie es geht.

Fügen Sie zuerst eine DataGridView in einem leeren Formular hinzu. Fügen Sie die Spalten nicht hinzu, wir fügen die Spalten nach Code hinzu. Sie müssen die Spalten nicht nach Code in Ihrem realen Projekt einfügen, sondern folgen Sie bitte den Anweisungen in diesem Beispiel. Ich füge Kommentare hinzu, um den Code leicht verständlich zu machen. Ich wähle zwei Klassen, um Station und Ausgabe zu halten. Dies ist auch optional, Sie können einfach einen DataReader verwenden und sie manuell hinzufügen. Hoffe das hilft dir.

Public Class Form1 

    Dim outputs As List(Of Output) ' this holds the fake output data. 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     ' Replace this section with the code to retrieve stations from database. 
     Dim stations As New List(Of Station) From { 
      New Station() With {.StationName = "Station 1"}, 
      New Station() With {.StationName = "Station 2"} 
     } 

     ' Add stations to first combobox 
     Dim firstColumn = New DataGridViewComboBoxColumn() 
     For Each station In stations 
      firstColumn.Items.Add(station.StationName) 
     Next 

     ' Populate fake data, replace this section with the code to retrive outputs from database. 
     outputs = New List(Of Output) From { 
      New Output() With {.OutputName = "OutP1", .StationName = "Station 1"}, 
      New Output() With {.OutputName = "OutP2", .StationName = "Station 1"}, 
      New Output() With {.OutputName = "OutP5", .StationName = "Station 2"}, 
      New Output() With {.OutputName = "OutP6", .StationName = "Station 2"}, 
      New Output() With {.OutputName = "OutP7", .StationName = "Station 2"} 
     } 

     ' add combobox columns to datagridview 
     DataGridView1.Columns.Add(firstColumn) 
     DataGridView1.Columns.Add(New DataGridViewComboBoxColumn()) 

    End Sub 

    Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit 

     ' Only process if the column is the second combobox. 
     ' You will need to change the index according to your second combobox index. 
     ' e.ColumnIndex = 1 because the second combobox index is 1 in this sample. 
     If e.ColumnIndex = 1 Then 

      ' Filter the outputs by selected Station in the row. 
      ' Change the ColumnIndex to your first combobox index. 
      ' DataGridView1(0, e.RowIndex) because the first combobox index is 0 in this sample. 
      Dim outputByStation = outputs.Where(Function(x) x.StationName = DataGridView1(0, e.RowIndex).Value.ToString()) 

      ' Get current cell, we're going to populate the combobox 
      Dim currentCell = CType(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewComboBoxCell) 

      ' Populate the cell's combobox. 
      currentCell.Items.Clear() 
      For Each output In outputByStation 
       currentCell.Items.Add(output.OutputName) 
      Next 

     End If 

    End Sub 

End Class 

Public Class Station 

    Public Property StationName As String 

End Class 

Public Class Output 

    Public Property OutputName() As String 
    Public Property StationName() As String 

End Class 

Screenshot:

enter image description here

+0

das war genau das, was ich gesucht habe danke sehr viel kann nicht abstimmen bcuz ich habe noch nicht 15 ruf –

+0

Sie können meine antwort annehmen. Sie erhalten Reputationspunkte für die Annahme von Antworten. Ich sehe, dass Sie eine Frage stellen, aber niemals eine Antwort akzeptieren. Bitte akzeptieren Sie die Antwort, die Ihre Probleme lösen. – Han

+0

Wenn Sie genug Reputation haben, um Ihre Meinung zu verbessern, sollten Sie eine gute Antwort auf Ihre Fragen finden. – Han