Datagridview mit Textbox filtern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Noyne.

    Datagridview mit Textbox filtern

    Hallo,

    ich stehe momentan ein wenig auf der Leitung, die wahrscheinlich gerade ein wenig zu lang ist. Folgendes Problem:

    Ich habe eine Anwendung, die auf einer MySQL-DB basiert. Die DB enthält zwei Tabellen: Kunden und Stellen. "Kunden" ist die übergeordnete Tabelle, "Stellen" enthält den Primärschlüssel aus Kunden als Fremdschlüssel. Löschweiterleitung ist eingerichtet. Das sieht so aus:



    Die Form enthält einen Splitcontainer, im linken Panel liegt das DGV für Kunden, im rechten Panel das DGV für Panel, darunter befindet sich noch ein Detailview.

    Das Ganze basiert auf dem, was ErfinderdesRades hier zusammengestellt und als Video veröffentlicht hat und funktioniert einwandfrei.

    Ich kann im linken Grid die Kunden auswählen und bekomme im rechten Grid die dazugehörigen Stellen angezeigt. Neue Kunden und neue Stellen lassen sich hinzufügen, der Fremdschlüssel aus Kunden wird korrekt in Stellen eingetragen. Bereits angelegte Einträge lassen sich bearbeiten. Abspeichen geht ebenfalls, ich habe auf den Bindingnavigator verzichtet und das alles mit einem Menustrip geklappt.

    Ich brauche zusätzlich noch die Möglichkeit, nach einer Textbox filtern zu können. Genauer gesagt, in der rechten Spalte sollen die Stellen angezeigt werden, die dem Filter entsprechen. Das habe ich über bindingsource.Filter gelöst und das funktioniert auch.

    Aber: es werden immer nur die Stellen angezeigt, die zu dem Kunden gehören, der im linken Grid ausgewählt ist. Ich brauche aber eine Filterung über alle Einträge in der Stellentabelle unabhängig von der Auswahl in der Kundentabelle.

    Das letzte, was ich versucht habe, war, vor der Übergabe des Filters an die Bindingsource die Selektionen in den beiden Datagrids aufzuheben, aber das half auch nicht.

    Mein Code im Filter sieht so aus:

    VB.NET-Quellcode

    1. Private Sub btnRefnrSuche_Click(sender As Object, e As EventArgs) Handles btnRefnrSuche.Click
    2. Me.Oa_kundeDataGridView.ClearSelection()
    3. Me.Oa_stelleDataGridView.ClearSelection()
    4. Dim ReferenznummerSuche As String = CStr(txtReferenznummer.Text)
    5. Me.Oa_stelleBindingSource.Filter = "oa_referenznummer = '" & ReferenznummerSuche & "'"
    6. End Sub


    Bin für jeden Hinweis dankbar, der mich auf die richtige Spur bringt, weil ich mich offensichtlich total verrannt habe.

    Danke, Volkmar
    Hey Volkmar ...

    Volkmar schrieb:

    es werden immer nur die Stellen angezeigt, die zu dem Kunden gehören, der im linken Grid ausgewählt ist.
    Dann hast du in den Datenquellen die falsche Tabelle auf das Form gezogen. Wenn du statt der Tabelle, die bei der Kundentabelle eingeschachtelt ist, die nimmst, die mit der Kundentabelle auf einer Ebene liegt, sollte das Problem nicht auftreten.

    Volkmar schrieb:

    CStr(txtReferenznummer.Text)
    ... ist Schwachsinn!! txtReferenznummer.Text IST bereits ein String!!!

    Volkmar schrieb:

    Dim ReferenznummerSuche As String = CStr(txtReferenznummer.Text)
    ... wird also zu Dim ReferenznummerSuche = txtReferenznummer.Text

    Damit sollte es doch funktionieren ...
    Your computer is running... You better go chase it! :P :D
    hallo, Noyne,

    erst einmal Danke für Deine Antwort.

    Ich weiß, dass
    ​CStr(txtReferenznummer.Text)
    doppelt gemoppelt ist. Strict on lässt grüßen.

    Aber um zum eigentlichen Problem zu kommen:

    Natürlich funktioniert es, wenn ich nicht die untergeordnete Stellentabelle als Grid aufziehen. Das stand aber nie in Frage.

    Mir geht es um die Variante, wenn man die Tabellen so in der Form hat, wie ich es beschrieben habe, ob es also dann einen Ansatz gibt, den Filter über alle Einträge der Stellentabelle laufen zu lassen. Dass das wahrscheinlich nicht geht, hatte ich schon vermutet, aber hier sind so viele Leute unterwegs, die davon so viel mehr Ahnung haben als ich, dass ich einfach mal eine Expertenmeinung hören wollte.

    Volkmar schrieb:

    Ich brauche aber eine Filterung über alle Einträge in der Stellentabelle unabhängig von der Auswahl in der Kundentabelle
    Dann musst du aber auch die Tabelle nehmen, die NICHT eingeschachtelt ist!! Die eingeschachtelte Tabelle ist "vorgefiltert" und enthält IMMER nur die Einträge des jeweiligen Kunden!!!

    Wenn du alle Einträge der Stellentabelle filtern willst, musst du auch die Tabelle nehmen, wo alle Einträge drinne sind und nicht die "vorgefilterte" ...

    Mir ist nicht bekannt, dass es über die eingeschachtelte Tabelle möglich ist, ALLE Einträge zu filtern!!! (Was auch keinen Sinn macht, dafür gibt's ja die "normale" Tabelle)
    Your computer is running... You better go chase it! :P :D
    sorry, ich will jetzt wirklich nicht besserwisserisch erscheinen, dafür habe ich selber zu wenig Ahnung, aber:

    So sieht das kollabierte Dataset aus:



    Das erweiterte Dataset sieht so aus:



    Natürlich ist die Stellentabelle doppelt vorhanden, einmal als untergeordnete Tabelle und einmal isoliert auf der selben Stufe wie die Kundentabelle.

    Aber:

    die Stellentabelle steht doch nicht im leeren Raum da, sondern ist Bestandteil des Datasets, so wie es in der Verknüpfung der beiden Tabellen definiert ist. Wenn ich die nicht untergeordnete Stellentabelle als Grid auf die Form ziehe, wird es genauso angezeigt wie bei der untergeordneten Stellentabelle. Wenn ich ein neues Dataset erstelle ohne die Verknüpfung zur Kundentabelle, wird alles angezeigt.

    Habe ich gerade alles ausprobiert.
    Hast du mal probiert, alle drei aufs Form zu ziehen?!
    Ist dir da mal aufgefallen, dass es trotz der beiden Stellen-DGVs nur EINE BindingSource gibt?! Je nachdem, welche Datenquelle du zuerst auf dein Form ziehst, bezieht sich die BindingSource entweder auf die eingeschachtelte ODER auf die "normale" Tabelle!!
    Wenn du hintereinander einfach beide Stellen-Tabellen auf dein Form ziehst, hast du nur eine BindingSource!!
    Aber es sind ja zwei unterschiedliche Tabellen (weil eine mit allen Datensätzen und eine mit den vorgefilterten)!!
    Dennoch haben beide DGVs DIESELBE BindingSource und das sollte nicht passieren, weil du willst dir ja unterschiedliche Sachen anzeigen lassen ...

    Die einfachste Variante wäre, die erste Tabelle auf das Form zu ziehen, die BindingSource umzubennen und danach erst die zweite auf das Form zu ziehen!! (siehe Anhangsprojekt)
    Danach hast du zwei Stellen-DGVs mit jeweils unterschiedlicher BindingSource und dann sollte das auch mit dem Filter funktionieren!!
    Du musst den Filter nur auf die richtige BindingSource setzen!!!
    Dateien
    • Testprojekt.zip

      (88,04 kB, 140 mal heruntergeladen, zuletzt: )
    Your computer is running... You better go chase it! :P :D

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

    Vielen Dank für Deine Mühe, ich hatte Dein Testprojekt gerade überhaupt nicht gesehen.

    Ich bin dann nach Deinem Vorschlag, unterschiedliche Bindingsources zu verwenden, selbst auf diese Lösung gekommen. Irgendwie war ich mir nicht darüber im Klaren, dass man ja mehrere Bindingsources mit einem Dataset verwenden kann. Manchmal ist man halt vernagelt.

    Wie schon gesagt, noch einmal vielen Dank :)