Wie kann man Filter im DGV per Button lösen?

  • VB.NET

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

    Wie kann man Filter im DGV per Button lösen?

    Guten Abend alle zusammen!

    Ich habe folgendes vor, weiß jedoch nicht ob das so möglich ist?!

    Gegeben:
    Eine Access-DB mit zwei Tabellen: Debitoren , Personen; diese stehen über das Feld "Debitor_ID" in einer 1:n Beziehung
    und
    ein Windows-Form, in der ich über die Datenquellen eine Combobox "Debitoren" und eine DGV "Personen" eingefügt habe.
    Beim verändern des Debitoren in der Combobox werden dann auch die zugehörigen Personen in der DGV angezeigt.

    Ziel:
    Ein Button "Alle", der mir in der DGV alle Personen, unabhängig zu welchen Debitoren sie gehören anzeigt. Zusätzlich könnte ich mir vorstellen, dass in der Combobox "alle" steht (natürlich nicht als Wert aus der Datenbank), er quasi "tot gelegt" ist.

    Ein zweiter Button "Debitorenfilter" welcher die Combobox "wiederbelebt" und eine "Filterung nach Debitor" in der Combobox wieder ermöglicht und somit die Anzeige der Personen im DGV einschränkt... quasi der "Vorher-Zustand" wieder herstellt. Als kleines Schmankerl wäre es nett, wenn man diese Funktion auch beim Klicken auf die "tote" Combobox erreichen könnte.

    Bei den Lösungsvorschlägen, sofern es überhaupt möglich ist, wäre zu beachten, dass ich später noch einen Detailbereich "PersonDetail" im Form ergänzen möchte (mit "Ändern" , "Neu" , "Löschen" -Buttons usw.


    Vielen Dank bereits im Voraus!
    Das Filtern in einem DGV wird eigentlich über einen Dataview gemacht, den dort kann man problemlos zur Lauftzeit einen Filter setzen.

    Der Weg ist Daten in Dataview und den Dataview als Datasource im DGV verwenden.

    Der andere Weg ist, jeweils eine neue Abfrage auf die Datenquelle mit den entschrechenden Einschränkungen an die Datenquelle zu senden.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Mhm...Vielen Dank für den Hinweis!

    Ich wollte es aber eigentlich über die BindingSources machen, da ich mal irgenwo gelesen habe, dass DataView wohl gewissermaßen veraltet sei.

    Zum Teil habe ich es ja auch hinbekommen, indem ich eine neue BindingSource "BindingSourceAllePersonen" mit Datasorce "DatenbankDataSet" und Datamember "tblPersonen" angelegt habe und mit dem Button "Alle" diese dann als DataSource für das DGV ändere:

    VB.NET-Quellcode

    1. Private Sub cmdAlle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAlle.Click
    2. TblPersonenDataGridView.DataSource = BindingSourceAllePersonen
    3. End Sub


    Soweit funktioniert in der DGV alles wie gewünscht... Probleme macht nur
    die Detailansicht, denn diese hat ja nach dem Lösen des Filters noch
    die TblPersonenBindingSource.

    Wie kann ich nun den einzelnen Textfeldern mitteilen, dass sie ihre Daten auch aus der "BindingSourceAllePersonen" beziehen soll? (siehe Bild)

    Der Button "Debitorenfilter" schaltet nun die Bindingsource wieder um auf den "Vorherzustand" mit der BindingSource "TblPersonenBindingSource"

    VB.NET-Quellcode

    1. Private Sub cmdFilter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFilter.Click
    2. TblPersonenDataGridView.DataSource = TblPersonenBindingSource
    3. End Sub
    Bilder
    • Databinding Textbox.JPG

      41,49 kB, 587×331, 142 mal angesehen
    Schade, hat denn keiner 'ne Antwort parat?

    Man könnte ja auch einfach eine zweite Detailansicht erzeugen und bei der Fage, welche BindingSource verwendet werden soll die "BindingSourceAllePersonen" auswählen.
    Dann schiebt man die Textboxen mit BindingSource "tblPersonenBindingSource" über die mit "BindingSourceAllePersonen" und spricht per "Alle"-Button die Eigenschaft "visible" an und setzt diese auf "false"... Es funktioniert zwar, ist jedoch bestimmt nicht im Sinne des Erfinders?!

    Vieleicht findet sich ja noch jemand mit einer besseren, sauberen Lösung?!

    Vielen Dank!
    Du brauchst zum Filtern nicht die Bindingsource umzustöpseln. Die Bindingsource verfügt über eine Filter-Eigenschaft, der du deine Filterbedingung "Spaltenname = 'DeinSuchbegriff'" mitgeben kannst.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: