DataGridView filtern mit mehreren Comboboxen

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von rdmguy.

    DataGridView filtern mit mehreren Comboboxen

    Hi,

    ich habe folgendes Problem, wo ich einfach nirgends eine passende und vor allem einfache Lösung gefunden habe - was mich etwas wundert, vielleicht suche ich auch nur falsch.

    Folgendes würde ich gerne erreichen

    In VisualStudio 2012 erstelle ich unter VB.NET eine Windows Forms Anwendung.

    Diese beinhaltet ein DataGridView, das mit Daten eines Tables von einem SQL Server gefüllt wird.
    DataSource setze ich schon bei der Erstellung im Editor - was mir ein Dataset, eine Bindingsource und einen Tableadapter erzeugt.

    Soweit so einfach.

    Konkret stellen die Daten eine Produktliste da, die Felder enthält wie Hersteller,Produktgruppe,Produktstatus,Produktname,etc

    Nun möchte ich gerne mindestens 4 Comboboxen haben, die das DataGridView nach den oben genannten Feldern filtern sollen

    Dabei soll folgendes passieren:
    Die 1. Combobox soll die Hersteller enthalten - die kommen in der Tabelle/DataGridView logischerweise mehrfach vor, sollen hier aber nur je 1x angeführt sein
    Wähle ich jetzt aus dem Combobox Dropdown einen Hersteller aus, soll sofort das DataGridView nur mehr Datensätze anzeigen, die diesem Kriterium entsprechen

    Die restlichen Comboboxen sollen dann ebenfalls nur mehr "passende" Werte anzeigen - also gibt es theoretisch Produktgruppe 1,2,3,4,5, Hersteller A hat aber nur Produkte der Gruppe 1,2,5 , soll
    die "Produktgruppe" Combobox nur mehr 1,2,5 als Auswahl anzeigen wenn in der "Hersteller" Combobox Hersteller A ausgewählt ist - dieselbe Logik dann für die anderen Comboboxen

    Beim Produktnamen wäre es super, wenn man Text eintippen kann und die Werte angezeigt werden, die den Text enthalten (quasi like %text% ), aber das ist jetzt mal nicht vorrangig.

    Gibt es für dieses Vorhaben ein relativ einfache Lösung? Scheint mir jetzt keine aussergewöhnliche Anforderung zu sein - aber ich finde keinen Ansatz dafür.

    Wobei ich sagen muss, dass ich mit diesen Dingen wenig Erfahrung habe.

    Wäre für jedliche Hilfe dankbar.


    LG
    Ansonsten ist hier unbedingt mal das Datenmodell auf Schwachstellen zu untersuchen, denn

    Haho76 schrieb:

    Hersteller,Produktgruppe,Produktstatus,Produktname
    sollten nach den Regeln der Datenmodellierung keinesfalls in ein und derselben Tabelle aufgeführt sein.

    Ein korrekt modelliertes Modell verringert sowohl den DBTraffic als auch vereinfacht derartige Filter-Funktionen immens.

    zu

    Haho76 schrieb:

    ich finde keinen Ansatz dafür.

    DataExpressions: Filter und berechnete Spalten im Dataset wären der Ansatz (und soweit ich weiß basiert auch die von vb1963 vorgeschlagenen Lösung darauf)

    ErfinderDesRades schrieb:

    Ansonsten ist hier unbedingt mal das Datenmodell auf Schwachstellen zu untersuchen, denn
    Zitat von Haho76: „Hersteller,Produktgruppe,Produktstatus,Produktname“sollten nach den Regeln der Datenmodellierung keinesfalls in ein und derselben Tabelle…


    Hmm, also konkret handelt es sich bei der Datenquelle um einen View der Daten aus unserem ERP (IFS um genau zu sein) liefert (mit gewissen Filterkriterien, die zB PRodukte mit einem bestimmten Status rausfiltern) ,
    das wiederum auf einer äusserst komplexen Oracle DB passiert.

    Prinzipiell kommen Daten aus mehreren Tabellen, das stimmt - wobei
    in einer Tabelle sehr wohl die Infos: Hersteller (eigentlich Lieferant) - Artikelnummer - Artikelstatus - Produktgruppe liegt.
    Wobei es sich bei Artikelstatus und Produktgruppe um Codes handelt - deren Beschreibung in einer extra Tabelle liegen.
    Produktname liegt ebenso in einer anderen Tabelle.

    Der View verwendet Scalar Value Functions um zB von Artikelnumemr auf Produktname zu kommen....

    Haho76 schrieb:

    DataSource setze ich schon bei der Erstellung im Editor - was mir ein Dataset, eine Bindingsource und einen Tableadapter erzeugt.


    Hört sich ähnlich an wie bei mir. Vielleicht hilft dir das Beispiel weiter...

    So in etwa könntest du deine Combobox füllen. Ich habe hier im Beispiel eine Combobox vom Toolstrip verwendet, kannst dir aber auch so welche aufs Form ziehen. Die Abfrage ist mit LINQ.

    VB.NET-Quellcode

    1. Private Sub Beispiel()
    2. Me.LieferantenTableAdapter.Fill(Me.MyDBDataSet.Lieferanten)
    3. Me.ToolStripComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    4. Dim Lieferanten = (From x In Me.MyDBDataSet.Lieferanten ' Tabelle Lieferant
    5. Order By x.Lieferanten Ascending ' Spaltenbezeichnung Lieferant
    6. Select x.Lieferanten).Distinct ' Lieferanten auswählen, Distinct = keine doppelten Einträge
    7. Me.ToolStripComboBox1.Items.Add("Alle")
    8. For Each s In Lieferanten
    9. Me.ToolStripComboBox1.Items.Add(s)
    10. Next
    11. Me.ToolStripComboBox1.SelectedIndex = 0
    12. End Sub


    Filtern könntest du dann z.B. so:

    VB.NET-Quellcode

    1. Private Sub ToolStripComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ToolStripComboBox1.SelectedIndexChanged
    2. If Me.ToolStripComboBox1.SelectedItem <> "Alle" Then
    3. Me.LieferantenBindingSource.Filter = "Lieferant = '" & Me.ToolStripComboBox1.SelectedItem & "'"
    4. End If
    5. End Sub


    Die Filtersyntax für die BindingSource findest du auf msdn.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „rdmguy“ ()