none
TableAdapter auslesen RRS feed

  • 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

    Montag, 14. Dezember 2015 09:54

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

    Mittwoch, 16. Dezember 2015 19:35

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


    Montag, 14. Dezember 2015 11:14
  • 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

    Montag, 14. Dezember 2015 15:25
  • 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

    Dienstag, 15. Dezember 2015 16:31
  • 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

    Dienstag, 15. Dezember 2015 17:35
  • Danke Elmar für deine Antwort. Ich werde deine Tipps einarbeiten.

    Bin halt der "Lernende".

    Ich wünsche Dir einen schönen Abend und eine schöne Woche.

    Gruß Piti

    Dienstag, 15. Dezember 2015 18:00
  • 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

    Mittwoch, 16. Dezember 2015 17:06
  • 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

    Mittwoch, 16. Dezember 2015 19:35