Datagridview mit Joining View: Filtern auf die Spalte mit DataGridViewComboBoxColumn

  • VB.NET

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

    Datagridview mit Joining View: Filtern auf die Spalte mit DataGridViewComboBoxColumn

    Hallo zusammen,

    erst einmal ein Lob an dieses Forum. Habe schon viele Problemlösungen gefunden, doch jetzt komme ich nicht mehr weiter.

    Ich habe ein typisiertes Dataset mit zwei Tabellen und ein Datagridview. Die beiden Tabellen habe ich per Joining View (aus dem bekannten Video) im DGV verbunden. Das funktioniert auch.

    Die Eigenschaft im DataGridViewComboBoxColumn habe ich wie folgt gesetzt: DisplayStyle = Nothing

    Tabelle A (übergeordnet)
    ID
    Nr
    Fahrzeug
    1
    4711
    LKW 1-1
    2
    6944
    LKW 4-3
    3
    0542
    PKW 5-2

    Tabelle B (untergeordnet), TB-Name: Meldungen
    ID
    Datum
    Nr
    Nachricht
    1
    01.01.2014 15:00
    0542
    Ladung A zu Punkt B fahren
    2
    01.01.2014 17:04
    4711
    Palette 1 in Lager holen
    3
    01.01.2014 17:35
    0542
    Paket bei Kunde A holen

    Datagridview
    Datum
    Fahrzeug
    Nachricht
    01.01.2014 15:00
    PKW 5-2
    Ladung A zu Punkt B fahren
    01.01.2014 17:04
    LKW 1-1
    Palette 1 in Lager holen
    01.01.2014 17:35
    PKW 5-2
    Paket bei Kunde A holen

    Der Benutzer soll die Möglichkeit haben, die Ansicht des Datagridview auf die Spalte "Name" zu filtern.

    Hatte dann was gefunden wie folgt:

    VB.NET-Quellcode

    1. Me.MeldungBindingSource.Filter = "Fahrzeug LIKE 'LKW%'"


    Jedoch funktioniert es leider so nicht. Wenn ich auf die Spalte "Nr" filtere, und die exakte Fahrzeugnr eingebe funktioniert der Filter.

    Was muss ich anpassen, oder welchen Ansatz muss ich wählen, das ich auf die Spalte DataGridViewComboBoxColumn mit den Werten aus der übergeordneten Tabelle filtern kann?
    ja, geht nicht ohne weiteres.
    Du kannst nur auf Spalten der aktuellen Tabelle filtern.
    Willst du also einen Nachricht-View nach Fahrzeug filtern, musste auf den Fremdschlüssel filtern, nicht auf den Namen des Fahrzeugs.
    Und es ist eine numerische Filterung, keine textbasierte.

    Hier wäre aber ein ParentChildView günstiger, der filtert den Nachricht-View ja automatisch nach Fahrzeug.

    Ansonsten was tricksen mit berechneten Spalten
    Die Filterung auf den Fremdschlüssel funktioniert schon. Jedoch müsste der Benutzer dann die Fahrzeug-Nr. kennen (die Daten kommen über eine Serielle Schnittstelle), und die kennt er nicht. Der Benutzer kann nur was mit den Fahrzeugnamen anfangen.

    Mit dem Textfilter könnte er sich z.B. nur alle PKW anzeigen lassen.

    Danke für den Tipp.
    Beim ParentChildView habe ich nur das Problem, dass ich zwei DGVs verwenden muss, und erst jede Nachricht einzeln anklicken müsste um dann im zweiten DGV den Fahrzeugnamen zu sehen.
    Oder gibt es mit ParentChildView noch eine andere Möglichkeit der Anzeige?
    du verstehst den ParentChild falsch: Dort wählt man ein Fahrzeug an, und sieht alle seine Nachrichten.

    Wenn du hingegen beides brauchst: mal alle Nachrichten ungefiltert, mal gefiltert auf ein Fahrzeug - ja, dann musste Filter setzen.
    Ich würde aber keinen Textfilter machen, sondern eine gebundene Combobox anbieten, mit der man auswählt, auf welches Auto man filtern will.

    Ist aber auch nervig, denn man muss dafür einen Nicht-Auto-Datensatz einführen, damit der Filter abgestellt werden kann, wenn das Nicht-Auto inne Combo gewählt ist.

    Verwendest du meine Helpers? Da ist glaub eine Extension drinne, mit der so Null-Datensätze generiert wern können. (bin mir aber nicht sicher, inzwischen gibts einige Helpers-Versionen :/ )

    Du musst auch nicht 2 DGVs verwenden. Parent-Control zur Auswahl der Autos kann ebensogut eine Combobox sein.

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

    Da ich gerne alle Informationen in einer Übersicht haben wollte, habe ich den Filter wie folgt umgesetzt:

    Die zu filternden Werte stehen in einer Tabelle, damit der Benutzer mehrere Filter anwenden kann.

    ID
    Filtertext
    1
    LKW %


    VB.NET-Quellcode

    1. 'String aus Tabelle "Filter" aufbauen, um die "Nr" der Fahrzeuge zu erhalten
    2. Dim ergebnis As String = ""
    3. For Each row In Me.DatenbankDataSet.Filter.Select("ID <> 0")
    4. ergebnis = ergebnis & "Fahrzeug LIKE '" & row("Filtertext") & "' AND "
    5. Next
    6. ' Letztes " AND " abschneiden
    7. ergebnis = ergebnis.Remove(ergebnis.Length - 4, 4)
    8. 'String aus Tabelle "Fahrzeuge" aufbauen, um den String auf BindingSource anzuwenden
    9. Dim ergebnis2 As String = "Nr IN ("
    10. For Each row In DatenbankDataSet.Fahrzeuge.Select(ergebnis)
    11. ergebnis2 = ergebnis2 & row("Nr") & ", "
    12. Next
    13. ' Letztes ", " abschneiden
    14. ergebnis2 = ergebnis2.Remove(ergebnis2.Length - 2, 2)
    15. Me.MeldungBindingSource.Filter = ergebnis2 & ")"

    naja, es geht wesentlich eleganter, aber prinzipiell hast du schon recht: bei komplexen Filtern muss man recht aufwändig Strings miteinander verketten.

    Allerdings scheinst du auch noch Strict Off zu proggen - dassis ganz schlecht: Option Strict On!

    Die Methode DataTable.Select() ist übrigens erbärmlich im Vergleich zu dem was Linq-to-Dataset leisten kann. Vor allem sollte sie nicht mit Sql-Select verwechselt werden.
    Wie gesagt: Linq2Dataset ist zwar auch was ganz anneres als Sql, entspricht dem aber (was DataTable.Select() nicht tut).

    Und diese "Nr IN" - Formulierung funktioniert? - mussich grad mal ausprobieren.
    Tatsache - dolle Sache - scheint blos überhaupt nicht dokumentiert zu sein! 8|
    Oder hast du da Doku zu gefunden?

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