DGV/BindingSource bei Textbox.Textchange 'live' filtern?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von EDR-Temporär.

    DGV/BindingSource bei Textbox.Textchange 'live' filtern?

    Hallo Leute :)

    und zwar habe ich eine BindingSource die meine Datensätze aus der DB ausliest und beim initialisieren meiner form die Results in mein DGV klatscht.
    Klappt auch super, sowohl refreshen, als auch Änderungen speichern.

    Jetzt möchte ich über diverse Textboxen unterhalb des DGV die "Visible Rows" filtern.
    da meine "uid" column mit aus der DB geladen wird (PrimeryKey, da sonst speichern nicht möglich wäre) würde ich gerne die komplette uid column ausblenden.
    die anderen Columns sollen bei Textchange in den Textboxen Live gefiltert werden.

    Als ich es ohne Binding Source gemacht habe ging das wie folgt:

    VB.NET-Quellcode

    1. Private Sub Databaseview_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. objconnection.ConnectionString = "provider=SQLOLEDB;data source=LU0504\SQLEXPRESS;database=TimeTracker;trusted_connection=yes;"
    3. ' **** DataSet- und DataTable-Instanz bilden
    4. ds_Data = New DataSet() ' DataSet-Instanz bilden
    5. dt_Data = New DataTable("DBData") ' DataTable-Instanz bilden
    6. ds_Data.Tables.Add(dt_Data) ' DataTable dem DataSet hinzufügen
    7. ' **** DataAdapter-Instanz bilden, Verbindung zur DB benennen,
    8. ' **** SELECT-Befehl übergeben, Datensätze einlesen mittels .Fill
    9. da = New OleDbDataAdapter("", objconnection)
    10. da.SelectCommand.CommandText = "SELECT [Date], [Name], [PartName], [FOA], [DocName], [RevNo], [proHours] FROM [dataDB] where [Name] like '" & Environment.UserName & "'"
    11. da.SelectCommand.CommandType = CommandType.Text
    12. da.Fill(dt_Data) ' DataTable füllen
    13. ' **** Filter setzen, aber noch ohne Filterkriterien, d.h. alles wird angezeigt
    14. dv = New DataView(ds_Data.Tables("DBData")) ' Welche DataTable soll gefiltert werden
    15. 'dv.RowFilter = "name like '" & Environment.UserName & "'"
    16. dv.RowFilter = ""
    17. DBDataGrid.DataSource = dv ' Filterergebnis als Datenquelle festlegen
    18. txtFilterMonth.Text = MMM
    19. 'Data Entry Sum befüllen
    20. txtEntrys.Text = DBDataGrid.Rows.Count
    21. End Sub
    22. Private Sub txtFilterMonth_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFilterMonth.TextChanged, txtFilterNOP.TextChanged, txtFilterFOA.TextChanged, txtFilterPNum.TextChanged
    23. dv.RowFilter = "Date LIKE '" & txtFilterMonth.Text _
    24. & "*' AND PartName LIKE '" & txtFilterNOP.Text _
    25. & "*' AND FOA LIKE '" & txtFilterFOA.Text _
    26. & "*' AND DocName LIKE '" & txtFilterPNum.Text _
    27. & "*' AND Name LIKE '" & Environment.UserName & "'"
    28. End Sub


    Jetzt verwende ich diesen Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    2. Handles Me.Load
    3. ' Bind the DataGridView to the BindingSource
    4. ' and load the data from the database.
    5. Me.DBDataGrid.DataSource = Me.bindingSource1
    6. GetData("SELECT * FROM [dataDB] where [Name] like '" & Environment.UserName & "'")
    7. End Sub
    8. Private Sub GetData(ByVal selectCommand As String)
    9. Try
    10. ' Specify a connection string. Replace the given value with a
    11. ' valid connection string for a Northwind SQL Server sample
    12. ' database accessible to your system.
    13. Dim connectionString As String = _
    14. "data source=LU0504\SQLEXPRESS;database=TimeTracker;trusted_connection=yes;"
    15. ' Create a new data adapter based on the specified query.
    16. Me.dataAdapter = New SqlDataAdapter(selectCommand, connectionString)
    17. ' Create a command builder to generate SQL update, insert, and
    18. ' delete commands based on selectCommand. These are used to
    19. ' update the database.
    20. Dim commandBuilder As New SqlCommandBuilder(Me.dataAdapter)
    21. ' Populate a new data table and bind it to the BindingSource.
    22. Dim table As New DataTable()
    23. table.Locale = System.Globalization.CultureInfo.InvariantCulture
    24. Me.dataAdapter.Fill(table)
    25. Me.bindingSource1.DataSource = table
    26. ' Resize the DataGridView columns to fit the newly loaded content.
    27. Me.DBDataGrid.AutoResizeColumns( _
    28. DataGridViewAutoSizeColumnsMode.AllCells)
    29. Catch ex As SqlException
    30. MessageBox.Show("No Connection to SQL DB!")
    31. End Try
    32. End Sub


    Wie filtere ich nun meine "visible rows" im DGV live? :(

    PS: Falls es hilft, hier sind die column Names in meiner DB: "[uid], [Date], [Name], [PartName], [FOA], [DocName], [RevNo], [proHours]", nach Datum, Partname, FOA, Docname soll später live gefiltert werden.
    Danke!

    Grüße,
    Kevin
    Aber wo genau im Code muss ich die den Filter einsetzen? weil in der GetData befüll ich mein DGV ja noch nicht, dies geschied ja erst im Load intervall?

    Ich bin grad ziemlich planlos :(

    €dit: ich habs geschafft, dass es live gefiltert wird, einfach durch:

    VB.NET-Quellcode

    1. Private Sub GetData(ByVal selectCommand As String)
    2. Try
    3. ' Specify a connection string. Replace the given value with a
    4. ' valid connection string for a Northwind SQL Server sample
    5. ' database accessible to your system.
    6. Dim connectionString As String = _
    7. "data source=LU0504\SQLEXPRESS;database=TimeTracker;trusted_connection=yes;"
    8. ' Create a new data adapter based on the specified query.
    9. Me.dataAdapter = New SqlDataAdapter(selectCommand, connectionString)
    10. ' Create a command builder to generate SQL update, insert, and
    11. ' delete commands based on selectCommand. These are used to
    12. ' update the database.
    13. Dim commandBuilder As New SqlCommandBuilder(Me.dataAdapter)
    14. ' Populate a new data table and bind it to the BindingSource.
    15. Dim table As New DataTable("DBData")
    16. table.Locale = System.Globalization.CultureInfo.InvariantCulture
    17. Me.dataAdapter.Fill(table)
    18. dv = New DataView(table) ' Welche DataTable soll gefiltert werden
    19. 'dv.RowFilter = "name like '" & Environment.UserName & "'"
    20. dv.RowFilter = ""
    21. Me.bindingSource1.DataSource = dv
    22. ' Resize the DataGridView columns to fit the newly loaded content.
    23. Me.DBDataGrid.AutoResizeColumns( _
    24. DataGridViewAutoSizeColumnsMode.AllCells)
    25. Catch ex As SqlException
    26. MessageBox.Show("No connection to SQL DB!")
    27. End Try
    28. End Sub


    jedoch habe ich jetzt folgendes problem, wenn ich durch Buttonpress speichern will:

    VB.NET-Quellcode

    1. Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    2. Me.dataAdapter.Update(CType(Me.bindingSource1.DataSource, DataTable))
    3. End Sub


    Fehlermeldung die kommt ist folgende:

    Das Objekt des Typs "System.Data.DataView" kann nicht in Typ "System.Data.DataTable" umgewandelt werden.



    Klar, durch das Filtern ist das jetzt im DataView format, wie kann ich das denn jetzt umgehen, dass ich diesen Fehler bekomme? :( Filtern und so weiter klappt alles super :/
    Danke!

    Grüße,
    Kevin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Viercnt“ ()

    Dein Grundproblem ist, dass du dich gleich anfangs auf die Db gestürzst hast, ohne die Konzepte von typisiertem Dataset und Databinding erstmal zu erlernen.
    Nun grabschst du ständig und nach belieben in die DB, erstellst andauernd neue untypisierte DataTables, und Databinding und BindingSources können nicht mehr viel für dich tun.
    Ich sags ja immer: zu früh auf die DB sich stürzen verbaut einem die Möglichkeiten, die Ado.Net vorsieht.

    guggemol die vier Views auf Video und weiterführende Links

    Das Prinzip ist: Nur 1 Dataset. Und dieses wird befüllt, und daran wird gebunden.
    Will man annere Daten sehen, so leert mans eben, und befüllts neu.
    ABer new DataTable() ist der Todesstoß, denn an new DataTable ist nix mehr gebunden.
    Auch weißt du nicht wo die DataTable abbleibt - jo du probierst, sie mit CType aus der BindingSource.DataSource auszupuhlen - Pech - da isse nich :P
    Ich erstelle doch nur einmal im GetData Sub eine BindingSource und ein Dataset?
    im Load wird die BindingDataSource an das DGV übergeben und angezeigt?

    also eigentlich ist das doch legitim?
    Ich verstehe nur noch nicht ganz, warum er das ganze nun nicht mehr abspeichern mag? :(
    Alles andere funktioniert super, sei es das Updaten über "GetData(Me.dataAdapter.SelectCommand.CommandText)", das live filtern (was mir aufgrund der DataView Sache jetzt die Speicherfunktion verbaut hat ^^'), etc. pp :(
    Danke!

    Grüße,
    Kevin
    naja - guck doch deinen Code: Du gibst beim Einlesen der BindingSource ein Dataview, aber beim Abspeichern versuchst du es auf DataTable zu casten.
    Aber ein Dataview ist keine DataTable.
    Gib der BindingSource eine DataTable.

    Aber überleg ernsthaft mal, ob du dir nicht iwann mal auf einen strukturierteren und typisierten Ansatz umsteigst.
    Danke dir! :)

    Ich habs gebacken bekommen :D
    Ich habe meine Bindingsource jetzt vordefiniert, diese binde ich jetzt an mein DGV und lasse die Bindingsource per .Filter filtern, anstatt ein DataView drüber zu hauen! :) Live filtern/Speichern klappt jetzt wunderbar! :)


    Nochmal zu dem Typisierten Datatables.
    Für mich ist das doch irrelevant, da ich nur eine Datatable habe, und diese Weder Parent/Childtables hat? also ist es doch immer von natur aus Eineindeutig? Oder habe ich "Typisierte Datatables" falsch verstanden?
    Danke!

    Grüße,
    Kevin
    ja, hast du falsch verstanden.

    Ich fürchte, das Datentyp-Konzept überhaupt ist dir nicht ganz klar (ZB. als Vergleichs-Operator scheinst du nur den Like-Operator zu kennen).

    Und Databinding im Designer sollteste mal probieren - da kann man ein DGV richtig hübsch machen.
    guggemol die vier Views auf Video