Bindingsource filtern



  • Hallo mal wieder,

    auf einer Form habe ist eine GridView, die auch mit Daten gefüllt wird.
    Nun soll, bei Eingabe von Zeichen in eine Textbox, nach Einträgen in einer bestimmten Spalte der Tabelle gefiltert werden.
    Dazu habe ich BindingSource.Filter entdeckt ... allerdings erhalte ich die Fehlermeldung, dass die Fehlermeldung, dass die Spalte nicht gefunden wird.

    Hier mal mein Code, vielleicht kann mir jemand von Euch helfen?!

    // Datenbankanfrage
     public static DataTable AlleLieferteile()
            {
                string strSQL;
    
                strSQL = @"SELECT DISTINCT a.bauteilnr, b.firma AS Lieferant, a.lieferartikelbezeichnung AS 'Artikelbezeichnung Lieferant', a.lieferartikelid AS 'Artikelnummer Lieferant'
                           FROM tbllieferartikel a, tblkundeninfo c, tblstandort b 
                           WHERE b.StandortID = c.StandortID 
                           AND a.KundenNr = c.KundenNr 
                           AND c.GeschaeftsartID = 2 
                           ORDER BY b.firma";
    
                using (var con = new MySqlConnection(sConnection))
                {
                    var command = new MySqlCommand(strSQL, con);
                    var da = new MySqlDataAdapter();
                    DataTable dt = new DataTable("Lieferartikel");
                    da.SelectCommand = command;
                    da.Fill(dt);
                    con.Dispose();
                    return dt;
                }
            }
    
    // Aufruf
    private void GridMitLieferteilenFuellen(int iOptionen)
            {
                BindingSource bs = new BindingSource();
    
                switch (iOptionen)
                {
                    case 1:
                        bs.DataSource = AlleLieferteile();
                        dgDeliveryItems.DataSource = bs;
                        break;
                    case 2:
                        bs.DataSource = AlleLieferteile();
                        bs.Filter = string.Format("a.lieferartikelbezeichnung like '{0}%'", tbArtikelVolltextSuche.Text);
                        dgDeliveryItems.DataSource = bs;
                        break;
                    case 3:
                        bs.DataSource = AlleLieferteile();
                        dgDeliveryItems.DataSource = bs;
    
                        break;
                    default:
                        break;
    
                }
            }
    

    Was ist also falsch an der Abfrage? Oder weshalb wird lieferartikelbezeichnung nicht als Spalte gefunden, obwohl diese in der SQL Abfrage enthalten ist?



  • Hallo,

    laß das "a." weg, also nur

    "lieferartikelbezeichnung like '{0}%'"
    

    P.S. Dispose() brauchst du nicht mehr explizit aufrufen, da du ja eine "using"-Anwendung dafür verwendest...



  • @Th69
    Hat leider so auch nicht funktioniert. Das Problem liegt wohl an folgendem SQL Teil

    a.lieferartikelbezeichnung AS 'Artikelbezeichnung Lieferant'
    

    Wenn ich den Teil nach dem AS weg lasse, dann funktioniert die Abfrage super!

    Danke für den Hinweis mit dem Dispose()!

    Eine Grundsätzliche Frage:
    Wie ist es schöner/besser/sicherer einen SQL String zu schreiben?
    Auf die von mir dargestellte Art und Weise oder über einen String Builder?



  • Nachtrag:
    Ist es auch möglich, gleichzeitig auf beide Textfelder zu filtern?

    Also in Lieferartikel suche ich nach 'schraube' und erhalte Einträge zu ~50 verschiedenen Lieferanten. Diese Liste soll dann eben nochmals (beim Suchen nach einem Lieferant) gefiltert werden.



  • Einen SQL-String solltest du mittels SQL-Parameter benutzen, s. [Artikelserie] SQL: Parameter von Befehlen.

    P.S: Filtern kannst du mittels "AND", s. http://msdn.microsoft.com/de-de/library/system.data.datacolumn.expression.aspx
    z.B.

    "lieferartikelbezeichnung like '{0}%' AND ..."
    

Anmelden zum Antworten