2016-07-18 15 views
1

Ich habe eine CSV-Datei, die ich in einem Kombinationsfeld in einer Datenrasteransicht laden. Meine csv ist wie folgt:Auswahl aus einem Kombinationsfeld mit Daten aus CSV in vb.net

prodname,prodcode,amt 
prodname1,prodcode1,amt1 
prodname2,prodcode2,amt2 

prodname ist, was ich in der Combobox in der Datagridview bin anzeigt.

Was ich will ist, wenn ich prodname1, prodcode1 und amt1 wird in der gleichen Zeile in der Datenrasteransicht angezeigt werden. Ich fange gerade an, in vb.net herumzufummeln und werde dankbar sein, wenn mir jemand hilft.

Dies ist, was ich jetzt haben:

Dim cmb As New DataGridViewComboBoxColumn() 
    cmb.HeaderText = "Product Name" 
    cmb.Name = "cmb" 
    DataGridView2.Columns.Add(cmb) 'code for a combobox column in datagridview 

    Dim filename As String 
    Dim dt As New DataTable 
    filename = "/file/path/here" 
    Dim sr As New IO.StreamReader(filename) 

    Dim newline() As String = sr.ReadLine.Split(","c) 
    dt.Columns.AddRange({New DataColumn(newline(0)), _ 
         New DataColumn(newline(1))}) 
    While (Not sr.EndOfStream) 
     newline = sr.ReadLine.Split(",") 
     Dim newrow As DataRow = dt.NewRow 
     cmb.Items.Add(newline(0)) 
     newrow.ItemArray = {newline(1)} 
     dt.Rows.Add(newrow) 
    End While 
    DataGridView2.DataSource = dt 

UPDATE:

ich meinen Code aktualisiert pro Antwort Alex, aber ich noch einen Fehler.

Dim cmb As New DataGridViewComboBoxColumn() 
    cmb.HeaderText = "Product Name" 
    cmb.Name = "cmb" 
    DataGridView1.Columns.Add(cmb) 

    AddHandler DataGridView1.CellValueChanged, AddressOf DataGridView1_OnCellValueChanged 
    AddHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf DataGridView1_OnCurrentCellDirtyStateChanged 

    Dim filename As String 

    filename = "/path/to/file" 
    Dim sr As New IO.StreamReader(filename) 

    Dim newline() As String = sr.ReadLine.Split(","c) 
    dt.Columns.AddRange({New DataColumn(newline(0)), _ 
    New DataColumn(newline(1))}) 

    While (Not sr.EndOfStream) 
     newline = sr.ReadLine.Split(","c) 
     Dim newrow As DataRow = dt.NewRow 
     cmb.Items.Add(newline(0)) 
     'newrow.ItemArray = {newline(1)} 
     dt.Rows.Add(newrow) 
     dicItems.Add(newline(0), newline.Skip(1)) 
    End While 
    DataGridView1.DataSource = dt 
End Sub 

Private Sub DataGridView1_OnCellValueChanged(ByVal s As Object, ByVal e As DataGridViewCellEventArgs) 
    If e.ColumnIndex = 0 Then 
     Dim changedCell = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex) 
     For i As Integer = 0 To dt.Columns.Count 
      dt.Rows(e.RowIndex).Item(i) = dicItems(changedCell.Value.ToString)(i) **error here** 
     Next 
    End If 
End Sub 

Private Sub DataGridView1_OnCurrentCellDirtyStateChanged(ByVal s As Object, ByVal e As EventArgs) 
    If DataGridView1.IsCurrentCellDirty Then 
     DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) 
    End If 
End Sub 
  • er verwendet Semikolons auf seine Probe, aber ich zu meinem Komma bin kleben. :)

Der Fehler sagt Cannot find column 2 oder wenn ich etwas zwicken, wird der Fehler The given key was not present in the dictionary auf der gleichen Linie

Here is my csv file done in Excel

Antwort

0

Sie müssen zwei neue Event-Handler:

AddHandler DataGridView1.CellValueChanged, AddressOf DataGridView1_OnCellValueChanged 
AddHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf DataGridView1_OnCurrentCellDirtyStateChanged 

Die Zuerst muss erkannt werden, ob sich der Zellenwert Ihrer Combobox geändert hat. Letzteres soll die OnCellValueChanged auslösen, wenn Sie auf einen Combobox-Eintrag klicken (standardmäßig wird das Ereignis nur ausgelöst, nachdem Sie die Zelle verlassen haben). Setzen Sie diesen Code in den Formularkonstruktor oder den Ereignishandler Load.

Zusätzlich müssen Sie speichern, welche prodname welche Details hat (z. B. prodname1 =>prodcode1,amt1). In meinem Beispiel habe ich das mit Dictionary<Key: string => Values: IEnumerable<string> gemacht.

Class Form1 
    Private dicItems As New Dictionary(Of String, IEnumerable(Of String)) 
    Private dt As New DataTable 
    ... 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    While (Not sr.EndOfStream) 
     newline = sr.ReadLine.Split(","c) 
     Dim newrow As DataRow = dt.NewRow 
     cmb.Items.Add(newline(0)) 
     dt.Rows.Add(newrow) 
     'Fill Dicitonary here. Key: newLine(0), values: newLine(1,2,...n) 
     dicItems.Add(newline(0), newline.Skip(1)) 
    End While 
    End Sub 

Der Code der Event-Handler sind ziemlich geradlinig:

Private sub DataGridView1_OnCurrentCellDirtyStateChanged(s As Object, e As EventArgs) 
     If DataGridView1.IsCurrentCellDirty Then 
      DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) 
     End If 
    End sub 

=> die CellValueChangedEvent Feuer des aktuellen Combobox Artikel Wechsel über commiting.

Private sub DataGridView1_OnCellValueChanged(s As Object, e As DataGridViewCellEventArgs) 
    If e.ColumnIndex = 0 Then 
     Dim changedCell = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex) 
     For i As Integer = 0 To dt.Columns.Count 
      dt.Rows(e.RowIndex).Item(i) = dicItems(changedCell.Value.ToString)(i) 
     Next   
    End If 
End sub 

=> Überprüfen Sie, ob die Combobox geändert hat (ColumnIndex = 0) und die veränderte Zelle erhalten.
Suchen Sie im Wörterbuch nach den entsprechenden prodcode,amt mit dem angegebenen Schlüssel (prodname).
Setzen Sie den neuen Wert in DataTable (Sie müssen dt ein Klassenfeld anstelle einer Variablen in Ihrer Load-Methode machen).

+0

hallo! Danke für Ihre Antwort.aber ich habe Fragen, dieser Code gibt mir eine Warnung "newline.Skip (1)" und wenn ich das Programm ausführen, nichts in meinem dgv angezeigt wird. und zweitens: Der angegebene Schlüssel war nicht im Wörterbuch vorhanden, wenn ich etwas in der Combobox auswähle. Es ist o diese Zeile 'dt.Rows (e.RowIndex) .Item (i) = dict (changedCell.Value.ToString) (i)' – predator

+0

Okay, ich habe den Teil newline.skip herausgefunden. Darin liegt immer noch ein Fehler. 'Der angegebene Schlüssel war im Dictionary nicht vorhanden.' – predator

+0

In diesem Fall hat' changedCell' einen Wert, den Sie vorher nicht in den Dictionray eingefügt haben. Setzen Sie Haltepunkte in 'dicItems.Add (newline (0), newline.Skip (1))' und 'changedCell.Value.ToString', um zu sehen, was passiert. Vielleicht haben Sie eine leere Zeile in Ihrer Textdatei? Btw mit den Demo-Daten, die du in deiner Frage angegeben hast, bekomme ich keinen Fehler. –