2016-05-23 12 views
1

Ich habe 3 Spalten, die ausgefüllt werden müssen, wenn ein Benutzer auf 'Suchen' klickt, aber jedes Mal, wenn ich auf 'Suchen' klicke, erscheint nur die Mitarbeiter-ID, weder der 'Vorname' noch der 'Nachname' in der Listenansicht. Die Daten existieren in meiner Access-Datenbank, dies ist bewiesen, da das Programm einen leeren Datensatz anstelle eines Nullwertfehlers erzeugt. Der Code, den ich die Listenansicht aufzufüllen bin mit ist:Listenansicht Populationsfehler

 ds.Clear() 
     lstClockin.Items.Clear() 
     con.ConnectionString = provider & datafile 
     con.Open()           'Open connection to the database 
     sqlstatement = "SELECT * FROM [EmployeeAccounts]" 
     da = New OleDb.OleDbDataAdapter(sqlstatement, con) 
     da.Fill(ds, "allmembers")       'Fill the data adapter 
     con.Close() 
     Dim recordCount, x As Short 
     recordCount = 0 
     x = 0 
     recordCount = ds.Tables("allmembers").Rows.Count 
     With ds.Tables("allmembers") 
      Do Until x = recordCount 
       lstClockin.Items.Add(.Rows(x).Item(0)) 
       lstClockin.Items(x).SubItems.Add(.Rows(x).Item(1)) 
       lstClockin.Items(x).SubItems.Add(.Rows(x).Item(2)) 
       lstClockin.Items(x).SubItems.Add(.Rows(x).Item(3)) 
       x = x + 1 
      Loop 
     End With 

Die ersten 3 Spalten in der Datenbank sind, [Employee ID], [Vorname] & [Nachname]

Alle Vorschläge sind herzlich willkommen; Ich habe jedoch ausgeschlossen, ein DataGridView oder ein beliebiges Steuerelement zu verwenden. Da dieses Programm eine ListView verwenden muss. Vielen Dank im Voraus!

+0

Warum nicht mit TreeView –

+0

Es ist nicht das gleiche Layout noch, was ich für dieses spezielle Programm _ _ dieses Programm benötigt, um eine ListView zu verwenden "_ –

+0

ok @Matt E werfen Sie einen Blick auf meine Antwort –

Antwort

2

Es gibt mehrere Dinge, die in dem Code kann verbessert werden:

Dim SQL = "SELECT Id, Name, Fish FROM Sample" 

Using dbcon As New OleDbConnection(ACEConnStr) 
    Using cmd As New OleDbCommand(SQL, dbcon) 

     dbcon.Open() 
     Dim lvi As ListViewItem 
     myLV.SuspendLayout() 
     Using rdr = cmd.ExecuteReader 
      Do While rdr.Read 

       lvi = New ListViewItem(rdr.GetInt32(0).ToString) 
       If rdr.IsDBNull(1) Then 
        lvi.SubItems.Add("") 
       Else 
        lvi.SubItems.Add(rdr.GetString(1)) 
       End If 

       If rdr.IsDBNull(2) Then 
        lvi.SubItems.Add("") 
       Else 
        lvi.SubItems.Add(rdr.GetString(2)) 
       End If 
       myLV.Items.Add(lvi) 
      Loop 
     End Using 
     myLV.ResumeLayout() 

    End Using 
End Using 
  • Anschlüsse und andere Objekte DB Provider Ressourcen zuweisen, die freigegeben werden müssen oder Ihre Anwendung undicht wird. Using Blöcke für Dinge, die Dispose implementieren wird geschlossen und für Sie entsorgen
  • Es besteht keine Notwendigkeit für eine DataAdapter ist, DataSet und DataTable, da Sie die Daten an die Steuer kopieren. Dieser Code verwendet eine DataReader, um die Daten abzurufen.
  • Statt SELECT * gibt die Abfrage die Spalten/Reihenfolge an, damit die Methoden Getxxxxx verwendet werden können, um typisierte Daten abzurufen. Das ist keine große Sache in diesem Fall, weil alles für die ListView Zeichenfolge konvertiert wird. lvi.SubItems.Add(rdr(COLUMN_NAME).ToString()) würde auch funktionieren.
  • Es scheint unwahrscheinlich, dass die ID-Spalte Null sein könnte, so dass der Code nur die anderen 2 für DbNull überprüft (eine andere Sache, die der DGV ohne Hilfe verarbeiten kann).
  • Da die ListView suboptimal und langsam beim Hinzufügen von Elementen ist, werden SuspendLayout und ResumeLayout verwendet, um Farben zu minimieren, während sie ausgefüllt sind.

enter image description here

Ich bin nicht sicher, was ...the program produces a blank record Mittel, sondern um eine ListView verwenden, wie es ein Gitter ist, die View Eigenschaft Details sein muss, und Sie müssen haben 3 Spalten in der IDE hinzugefügt (oder manuell im Code erstellen). Ohne diese Einstellungen wird nichts angezeigt.

Wenn die DataTable benötigt wird/anderswo verwendet wird, können Sie immer noch ein füllen ohne DataAdpater und bevölkern die LV von ihm:

... 
dt.Load(cmd.ExecuteReader) 
For Each row As DataRow In dt.Rows 

    lvi = New ListViewItem(row(0).ToString()) 
    If DBNull.Value.Equals(row(1)) Then 
     lvi.SubItems.Add("") 
    Else 
     lvi.SubItems.Add(row(1).ToString()) 
    End If 
    If DBNull.Value.Equals(row(2)) Then 
     lvi.SubItems.Add("") 
    Else 
     lvi.SubItems.Add(row(2).ToString()) 
    End If 
    myLV.Items.Add(lvi) 
Next 

Dieser verwendet eine andere DBNull Prüfung, da es eine DataRow wird und nicht mit der DataReader.