Datenfilterung eines DataGridView mit einer TextBox

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von HerrFrie.

    Datenfilterung eines DataGridView mit einer TextBox

    Hallo,


    komme von Access, beherrsche die SQL Abfragen mehr oder weniger gut. Bin jetzt VB 2010 Quereinsteiger. Habe mit dem Assistenten eine Access Datenbank mit mehreren Tabellen importiert.

    Ich möchte dann die Daten in einem DataGridView filtern.

    Habe die Abfrage so gestaltet:

    SQL-Abfrage

    1. SELECT ID, Datum, ArtNr, ArtName
    2. FROM tblArtikel
    3. WHERE (ArtNr LIKE '& @fldSuche.Text &' ) AND (ArtName LIKE '& @fldSuche.Text &')


    Die Abfrage lautet FillBySuchen.

    Eine Textbox mit "fldSuche" auf das Formular gesetzt und einen Button mit der Bezeichnung "btnSuche".


    Dieser ruft die Abfrage auf.

    VB.NET-Quellcode

    1. Private Sub btnSuche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    2. Handles btnSuche.Click
    3. Me.TblArtikelTableAdapter.FillBySuchen(Me.DatenDataSet.tblArtikel)
    4. End Sub



    Leider wird das DataGridView nach der Suche geleert, obwohl die zu suchenden Begriffe in den Spalten vorkommen.

    Wo liegt der Fehler?
    Hallo,

    ich würde das vielleicht anders machen.

    Wenn du deine DataTable per DataAdapter füllst, eine DataView erstellst, diese an eine BindingSource hängst und das DataGridView an die DataView hängst, kannst du die DataView filtern ohne ständig die Datenbank neu einlesen zu müssen.

    VB.NET-Quellcode

    1. DataAdapter.Fill(DataTable)
    2. DataView=DataTable.DefaultView
    3. BindingSource.DataSource=DataView
    4. DataGridView.DataSource=BindingSource


    Die Ansicht kann jetzt so einfach gefiltert werden. Kommt dann in die Procedure, die bei Button Klick ausgeführt wird.

    VB.NET-Quellcode

    1. DataView.RowFilter = "ArtNr LIKE '" & fldName.Text & "%'"



    PS: bei deinem Filter werden auch nur Datensätze angezeigt, wo die ArtNr UND ArtName gleich deiner Textbox.text ist.
    Hallo,

    habe mich immer mal mit deiner Lösung die letzten Tage auseinander gesetzt. Habe es so programmiert:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Data.OleDb
    4. Public Class frmArtAnzeigen
    5. Private Sub btnSuche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    6. Handles btnSuche.Click
    7. 'Me.TblArtikelTableAdapter.FillBySuchen(Me.DatenDataSet.tblArtikel)
    8. If fldSuche.Text = "" Then
    9. DBZugriff()
    10. Else
    11. DBZugriff("ArtName LIKE '*" & fldSuche.Text & "*' OR ArtNr = " & fldSuche.Text & " ")
    12. End If
    13. End Sub
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    15. Handles MyBase.Load
    16. DBZugriff()
    17. End Sub
    18. Private Sub DBZugriff(Optional ByVal Filter As String = "")
    19. Dim pCn As OleDb.OleDbConnection
    20. Dim ConnectionString As String
    21. Dim lokPfad As String
    22. lokPfad = IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath)
    23. ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" &
    24. "Data Source=" & lokPfad & "\Daten.mdb"
    25. pCn = New OleDb.OleDbConnection(ConnectionString)
    26. Try
    27. pCn.Open()
    28. Catch ex As Exception
    29. MessageBox.Show("Kann keine Verbindung zur DB herstellen. Ist die Datei vorhanden?")
    30. End Try
    31. If pCn.State = ConnectionState.Open Then
    32. Dim strsql As String = "SELECT * FROM tblArtikel"
    33. Dim SQL As New OleDb.OleDbCommand(strsql, pCn)
    34. Dim DataAdapter As New OleDb.OleDbDataAdapter(SQL)
    35. Dim DataTable As New DataTable("tblArtikel")
    36. Dim DataView As DataView = New DataView(DataTable)
    37. Dim BindingSource As BindingSource = New BindingSource()
    38. DataAdapter.Fill(DataTable)
    39. DataView = DataTable.DefaultView
    40. BindingSource.DataSource = DataView
    41. 'Ggf. filtern
    42. DataView.RowFilter = Filter
    43. 'Sortieren
    44. DataView.Sort = "ID DESC"
    45. 'Name des DataGridview auf dem Formular"
    46. DataGridView1.DataSource = BindingSource
    47. End If
    48. End Sub
    49. End Class


    Wie kann ich jetzt elegant den DataView.RowFilter setzen? Muss ich jedes Mal die Prozedur DBZugriff aufrufen? Achja und wie kann ich eine Art "LIKE" Operator für Zahlen verwenden? Also wenn Zahl Teil von ArtNr ist?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB2010 User“ ()

    Hi,

    ich habe das bei mir so gelöst:

    Du mußt nicht jedes mal die Datenbank neu einlesen. Sämtliche Daten werden einmal in deine DataTable eingelesen und dem DataView zugewiesen. Dieses DataView dient dazu, verschiedene Ansichten/Filterungen des DataTable anzuzeigen.
    Ich habe eine Textbox, wodurch das DataView gefiltert wird. Diese Frage ich mit dem Handle Textbox.keyup ab und mache dann eine Select Case Abfrage, die nur auf RETURN regiert. Wird diese Taste dann gedrückt wird der Befehl :

    VB.NET-Quellcode

    1. DataView.RowFilter = "Name LIKE '" & Textbox.Text & "'% AND Vorname LIKE '" & Textbox.Text & "'%"

    ausgeführt, wobei die Anzeige dann gefiltert wird. Soll der Filter gelöscht werden, kann man einfach

    VB.NET-Quellcode

    1. DataView.RowFilter = ""
    schreiben und den Text in der Textbox löschen.

    Integer Felder sollten einfach ohne ' zu filtern sein.

    VB.NET-Quellcode

    1. DataView.RowFilter = "Telefon LIKE " & TelefonTextbox.Text & "%"