Announcement

Collapse
No announcement yet.

DataGridView mit ComboBox Filter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataGridView mit ComboBox Filter

    Hallo liebes Forum,

    ich habe ein Problem mit der Programmierung einer DataGridView mit Filter über eine ComboBox.
    Ich hole mir aus einer MySQL Datenbank eine komplette Tabelle, die in der DataGridView auch korrekt angezeigt wird.
    Die Anbindung habe ich über ein BindingSource-Objekt realisiert.

    Nun habe ich die Herausforderung für 5 verschiedene Spalten der Tabelle einen Filter anzulegen.
    Dafür habe ich 5 ComboBoxen angelegt. Bei der Initialisierung klappt das auch ganz gut.
    Wenn ich jetzt aber eine Auswahl treffe sollen die anderen ComboBoxen automatisch aktualisiert werden.
    Arbeite ich hier direkt über das Binding ist der Inhalt der ComboBoxen nicht "DISTINCT".

    Beispiel:
    Code:
    void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
    		{
    			traderFilter = comboBox2.Text.ToString();
    			
    			tableBinding.Filter = string.Format("TRADER like '%" + traderFilter + "'");
    			
    			
    			comboBox3.DataSource = tableBinding;
    			comboBox3.ValueMember = "KNDNR";
    			comboBox3.Sorted = true;
    			
    			comboBox4.DataSource = tableBinding;
    			comboBox4.DisplayMember = "USERNAME";	
    			
    			comboBox5.DataSource = tableBinding;
    			comboBox5.DisplayMember = "CMONTH";
    			
    		        comboBox6.DataSource = tableBinding;
    			comboBox6.DisplayMember = "HERSTELLER";
                     }

    Wie kann ich Comboboxen während der Laufzeit mit DISTINCT aus dem DataGridView aktualisieren?

    Im Debugger kann ich erkennen, dass beim Aufruf des Bindings jedes Mal die

    Über neue Ideen würde ich mich sehr freuen.

    Liebe Grüße
    Dotty

  • #2
    Man filtert Rows keine Spalten. Wenn du die Datenmenge filterst erhälst du also genau eine Filtervariante wenn du für verschiedene Comboboxen andere Filter brauchst mit verschiedenen Bedingungen für Distinct brauchst du auch entsprechenden viele Views mit eigenen Filtern. Wobei mir beim filtern jetzt gerade keine Variante einfällt wie man eine Distinct Entsprechung bekommt. Mußt du mal die Doku konsultieren.

    Im Debugger kann ich erkennen, dass beim Aufruf des Bindings jedes Mal die
    Da sollte der Satz bestimmt irgendwie weiter

    Comment


    • #3
      Hallo, vielen Dank für die Antwort. Ja, natürlich filtert man Rows und keine Spalten, da habe ich mich leider falsch ausgedrückt. Leider bin ich seitdem noch nicht viel weitergekommen. Mein Problem ist, dass ich zwar korrekt gefüllte Comboboxen habe, die aber nicht "DISTINCT" sind. Die Befüllung der Comboboxen erfolgt direkt über das Binding-Objekt. Gibt es eventuell eine Methode, mit der ich die ComboBox nach Befüllung durch das Binding-Objekt auf "DISTINCT" setzen kann? Bei meinen Versuchen über eine Änderung durch eine foreach-Schleife führten immer zu Fehlern. Mir gehen im Moment die Ideen aus.
      Liebe Grüße
      Dotty

      Comment


      • #4
        Die ComboBox zeigt das an was gebunden wurde. Wenn du verschieden Filter brauchst dann brauchst du auch verschiedene Quellen/Filter.
        Ohne jetzt die Details deiner Anwendung zu kennen gehe ich mal davon aus das es hier nicht hilft ein BindingSource an die Combobox zu zu binden da die Auswahl in der Combobox nicht zurückgespielt werden soll in die Quelle. Wie sollte das auch gehen nach einem Distinct gibt es keinen 1-zu-1 Zusammenhang mehr zwischen den eindeutigen Datensätzen in der Combobox und den mehrdeutigen aus der Quelle.

        Ein Distinct Filter gibt es vermutlich eh nicht, ich gehe dabei davon aus das die eigentliche Quelle eine DataTable ist. Das ist die einzige Standardquelle die Filtern über eine BindingSource unterstützt. Eine BindingSource kann gar nicht selber Filtern sondern reicht das einfach an die Quelle weiter. Und DataTables kennen keinen Distinct. Zumindest ist mir das nicht bewußt. Wenn dem alles so ist würde ich direkt die DataTable als Quelle verwenden und per LINQ eine ~distinct~ Liste mit den gewünschten Werten erzeugen.

        [HIGHLIGHT=C#]comboBox3.DataSource = meineLiebeEigentlicheDataTable.AsEnumerable().Wher e(x => x.Field<string>("TRADER").EndsWith(traderFilter)). Select(x => x.Field<Int64>("KNDNR")).Distinct();
        // comboBox3.ValueMember = "KNDNR"; // die Zeile muss weg
        comboBox3.Sorted = true;
        [/HIGHLIGHT]

        Comment

        Working...
        X