Benutzer mit den meisten Antworten
TableAdapter auslesen

Frage
-
Hallo an Alle im Forum,
ich habe eine Frage zum TableAdapter. Ich lese immer die Daten nach einer Abfrage mit Da.Fill(TA) in ein DataGrid ein.
Me.DataGridView1.DataSource = TA '(Habe das aus dem Kopf geschrieben) 'Funzt!
Jetzt möchte ich die Werte in ein ListViewControl einlesen. Wie ich ein DataGrid auslese habe ich gefunden und geht auch recht gut. Hat jemand ein kleines Beispiel für mich? Oder auch einen Link. Bis jetzt habe ich alles mit eurer Hilfe geschafft und Danke Euch auch dafür.
Ich hoffe, jemand kann mir helfen. Bis dahin wünsche Ich euch eine schöne Zeit.
Piti
Antworten
-
Hallo Piti,
hier (m)eine Variante:
Private Sub Werte_anzeigen() Dim table As New DataTable() Dim die_Zahl As Integer ' entsprechend Sql Datentyp ' Gleich raus => erzeugt keine unnötigen Objekte If Me.txt_Start_Auswahl.Text = "" Then Exit Sub End If ' Gültiger Startwert (Meldung kann präziser sein)? If Not Integer.TryParse(Me.txt_Start_Auswahl.Text, die_zahl) Then MessageBox.Show("Kein gültiger Startwert.") Exit Sub End If Using connection As New SqlCeConnection(CnSt) Using adapter As New SqlCeDataAdapter( "SELECT Kennzeichen_Buchstabe_Roh, Kennzeichen_Zahl_Roh, TP_Roh " & "FROM Fahrzeugdaten_Roh " & "WHERE (Kennzeichen_Zahl_Roh = @die_Zahl);", connection) ' AddWithValue ist unproblematischer, siehe Doku adapter.SelectCommand.Parameters.AddWithValue("@die_Zahl", die_Zahl) adapter.Fill(table) End Using End Using If table.Rows.Count = 0 Then MsgBox("Es wurden keine Werte gefunden!", MsgBoxStyle.Information, "Information") Me.txt_Start_Auswahl.Clear() End If ' Einmal reicht, denn For Each endet sofort wenn die Tabelle leer ist. Call listView_laden() 'ListView füllen, verwendet Schleifenvariable row aus For Each (spart i und Zugriffe via Index) For Each row As DataRow In table.Rows Dim item As ListViewItem = Me.lsv_Auswahl.Items.Add(row("Kennzeichen_Buchstabe_Roh").ToString()) item.SubItems.Add(row("Kennzeichen_Zahl_Roh").ToString()) item.SubItems.Add(row("TP_Roh").ToString()) Next End Sub
(Ich mag keine zweibuchstabigen Kurzvariablen ;)
Gruß Elmar
- Bearbeitet Elmar Boye Mittwoch, 16. Dezember 2015 19:39
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 21. Dezember 2015 11:44
- Als Antwort markiert Der_Lernende Freitag, 25. Dezember 2015 09:20
Alle Antworten
-
Hallo Piti,
das ListView Steuerelement in Windows Forms unterstützt leider keine Datenbindung. Will man eine (typisierte) DataTable darin anzeigen, so muss man die Elemente selbst erstellen und anfügen, siehe dazu:
populate a listview or listbox from datatable (windows form)
Enfacher ist es i. a. das DataGridView Steuerelement zu verwenden und es entsprechend zu konfigurieren. Denn es hat (neben der Datenbindung) deutlich mehr Möglichkeiten, spätestens wenn man die Elemente bearbeitet werden sollen.
Gruß Elmar
-
Hall Elmar,
Danke für deine Anwort, klar man muss die Daten "selber" in das Control laden. Eine DataSource Eigenschaft wie eine Listbox besitzt das ListView nicht. Das ist mir klar. Muss man auch in Excel oder auch Access über Code reinladen.
In Access habe ich ein RecordSet das ich auslesen kann. Ich habe mir den Link mal angeschaut und folgender Code scheint ein richter Ansatz zu sein.
ListItem li = listBox1.Items.Add(dt.Rows[i][0].ToString()); li.SubItems.Add(dt.Rows[i][1].ToString()); li.SubItems.Add(dt.Rows[i][2].ToString());
Natürlich mit Item und SubItems. Werde es mal ausprobieren.
Im übrigen mag ich das ListViewControl, da man eine ganze Mege auch optisch machen.
Werde mich wieder melden. Danke Dir, wünsch Dir einen schönen Abend.
Gruß Piti
-
Hallo an Alle im Forum, hallo Elmar
Habe es geschafft. Hier mal der Code für die Abfrage und dann das laden der Werte im TableAdapter in den ListView. Man kann natürlich auch das DataGridView Control nehmen.
Private Sub Werte_anzeigen() Dim Cn As New SqlCeConnection(CnSt) Dim Cmd As SqlCeCommand = Cn.CreateCommand Dim der_Sql As String 'Dim strText If Me.txt_Start_Auswahl.Text = "" Then Exit Sub Cmd.CommandType = CommandType.Text der_Sql = "SELECT Kennzeichen_Buchstabe_Roh, Kennzeichen_Zahl_Roh, TP_Roh " & _ "FROM Fahrzeugdaten_Roh " & _ "WHERE (Kennzeichen_Zahl_Roh = @die_Zahl)" Cmd.CommandText = der_Sql Cmd.Parameters.Add("@die_Zahl", CLng(Me.txt_Start_Auswahl.Text)) Dim Da As New SqlCeDataAdapter(Cmd) Dim Ta As New DataTable Da.Fill(Ta) '****************************************************************************** 'ListView füllen For i = 0 To Ta.Rows.Count - 1 'For y = 0 To Ta.Columns.Count - 1 'strText = Ta.Rows(i)("TP_Roh").ToString() 'strText = Ta.Columns(y).ToString Dim Lv As ListViewItem = Me.lsv_Auswahl.Items.Add(Ta.Rows(i)("Kennzeichen_Buchstabe_Roh").ToString()) Lv.SubItems.Add(Ta.Rows(i)("Kennzeichen_Zahl_Roh").ToString()) Lv.SubItems.Add(Ta.Rows(i)("TP_Roh").ToString()) 'Next Next '****************************************************************************** Me.DataGridView1.DataSource = Ta Cn.Close() End Sub
Wünsche Euch einen schönen Abend
-
Hallo,
einige kleine Hinweise zu Deinem Code:
Etwas wie CLng(Me.txt_Start_Auswahl.Text)) ist problematisch, besser verwende Integer.TryParse - die TryParse Methode existiert für alle numerisch Datentypen und man sollte die (hier zum Parameter) passende nehmen.
Das Öffnen und Schliessen der Verbindung (Cn) sollte in einer using Anweisung verpackt werden - wobei man hier das Schließen direkt nach dem Fill durchführen sollte. Dadurch wird sicher gestellt, dass die Verbindung auch bei einer Ausnahme geschlossen wird. In einfachen Fäleln kann man es aber auch (SqlCe)DataAdapter überlassen; denn der prüft ob die Verbindung bereits geöffnet ist und übernimmt es ggf. für einen.
Alternativ zum Jonglieren mit Indizes kann man mit For Each arbeiten:
For Each row As DataRow in Ta.Rows Next
was den Zugriff auf die Datenzeile vereinfacht.
Gruß Elmar
-
Hallo Elmar,
habe deine Hinweise eingearbeitet. Jetzt sieht der finale Code so aus. Wenn Du noch ein paar Hinweise hast, immer zu! Ich will lernen!
Aber hier der Code:
Private Sub Werte_anzeigen() Using Cn As New SqlCeConnection(CnSt) Dim Cmd As SqlCeCommand = Cn.CreateCommand Dim der_Sql As String Dim i As Long 'Dim strText If Me.txt_Start_Auswahl.Text = "" Then Exit Sub Cmd.CommandType = CommandType.Text der_Sql = "SELECT Kennzeichen_Buchstabe_Roh, Kennzeichen_Zahl_Roh, TP_Roh " & _ "FROM Fahrzeugdaten_Roh " & _ "WHERE (Kennzeichen_Zahl_Roh = @die_Zahl)" Cmd.CommandText = der_Sql Cmd.Parameters.Add("@die_Zahl", CLng(Me.txt_Start_Auswahl.Text)) Dim Da As New SqlCeDataAdapter(Cmd) Dim Ta As New DataTable Da.Fill(Ta) Cn.Close() If Ta.Rows.Count = 0 Then MsgBox("Es wurden keine Werte gefunden!", MsgBoxStyle.Information, "Information") Me.txt_Start_Auswahl.Clear() Call listView_laden() Exit Sub End If 'Me.dtg_Auswahl.DataSource = Ta '****************************************************************************** 'ListView füllen Call listView_laden() i = 0 For Each row As DataRow In Ta.Rows ' For i = 0 To Ta.Rows.Count - 1 'strText = Ta.Rows(i)("TP_Roh").ToString() 'strText = Ta.Columns(y).ToString Dim Lv As ListViewItem = Me.lsv_Auswahl.Items.Add(Ta.Rows(i)("Kennzeichen_Buchstabe_Roh").ToString()) Lv.SubItems.Add(Ta.Rows(i)("Kennzeichen_Zahl_Roh").ToString()) Lv.SubItems.Add(Ta.Rows(i)("TP_Roh").ToString()) 'Next i = +1 Next '****************************************************************************** End Using End Sub
Ich danke Dir für deine Mühen und wünsch noch einen schönen Abend.
Gruß Piti
-
Hallo Piti,
hier (m)eine Variante:
Private Sub Werte_anzeigen() Dim table As New DataTable() Dim die_Zahl As Integer ' entsprechend Sql Datentyp ' Gleich raus => erzeugt keine unnötigen Objekte If Me.txt_Start_Auswahl.Text = "" Then Exit Sub End If ' Gültiger Startwert (Meldung kann präziser sein)? If Not Integer.TryParse(Me.txt_Start_Auswahl.Text, die_zahl) Then MessageBox.Show("Kein gültiger Startwert.") Exit Sub End If Using connection As New SqlCeConnection(CnSt) Using adapter As New SqlCeDataAdapter( "SELECT Kennzeichen_Buchstabe_Roh, Kennzeichen_Zahl_Roh, TP_Roh " & "FROM Fahrzeugdaten_Roh " & "WHERE (Kennzeichen_Zahl_Roh = @die_Zahl);", connection) ' AddWithValue ist unproblematischer, siehe Doku adapter.SelectCommand.Parameters.AddWithValue("@die_Zahl", die_Zahl) adapter.Fill(table) End Using End Using If table.Rows.Count = 0 Then MsgBox("Es wurden keine Werte gefunden!", MsgBoxStyle.Information, "Information") Me.txt_Start_Auswahl.Clear() End If ' Einmal reicht, denn For Each endet sofort wenn die Tabelle leer ist. Call listView_laden() 'ListView füllen, verwendet Schleifenvariable row aus For Each (spart i und Zugriffe via Index) For Each row As DataRow In table.Rows Dim item As ListViewItem = Me.lsv_Auswahl.Items.Add(row("Kennzeichen_Buchstabe_Roh").ToString()) item.SubItems.Add(row("Kennzeichen_Zahl_Roh").ToString()) item.SubItems.Add(row("TP_Roh").ToString()) Next End Sub
(Ich mag keine zweibuchstabigen Kurzvariablen ;)
Gruß Elmar
- Bearbeitet Elmar Boye Mittwoch, 16. Dezember 2015 19:39
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 21. Dezember 2015 11:44
- Als Antwort markiert Der_Lernende Freitag, 25. Dezember 2015 09:20