DataGridView mit Suche einschränken



  • Hi,

    ich habe eine DataGridView erstellt die ich mit Daten aus einer DataSet Tabelle befülle. Nun möchte ich aber die Daten in der Liste durch Eingabe eines Suchschlüssels einschränken. D.h. ich hab ein Textfeld, in das ein Kriterum eingegen wird.

    Bei einem TextChanged des Textfeldes wird dann folgendes aufgerufen:

    cmdGenre = new OleDbCommand("SELECT DISTINCT Genre FROM Songs WHERE Genre LIKE '" + Suchtext + "*'", con);
    daGenre = new OleDbDataAdapter(cmdGenre);
    ds.Tables["Genre"].Clear();
    daGenre.Fill(ds, "Genre");
    dataGridViewGenre.DataSource = ds.Tables["Genre"];
    

    Doch leider ist das DataGridView danach leer.
    Auch wenn die Abfrage von hand in der Datenbank ein Ergebnis liefert.

    Woran kann das liegen?

    Gruß SkySurfer



  • Wenn es ein DB auf dem MS SQL-Server ist oder ein ACCESS-DB dann probier doch bitte vorher Deine Abfrage dort aus ob es Ergebnise liefert.

    Wenn nicht oder es meckert stimmt was an deinem SQL nicht!

    Desweiteren wirst Du doch bestimmt deine DB etwas normalisiert haben
    wenn ja würde ich fuer Genre eine eigene Tabelle machen (Genres) und Genre als
    Fremdschlüssel in die Tabelle "Songs" aufnehmen.

    Denn dann müsstes Du nicht mit Distinct in der Songs-Tabelle rumfrickeln
    um einzelne Genre zu suchen. Denn dann hättest Du die ganzen Genre in einer eigenen Tabelle mit dem genrenamen und einer laufenden Nummer fuer Genre!

    "SELECT * FROM Genres WHERE Genre LIKE '" + Suchtext + "'"

    Wenn Du den DB-Assistenten der IDE nutzt kannst Du dort im Abfrageeditor auch vorab deine SQL-Statments zusammenbauen und testen!



  • SkySurfer schrieb:

    Hi,

    ich habe eine DataGridView erstellt die ich mit Daten aus einer DataSet Tabelle befülle. Nun möchte ich aber die Daten in der Liste durch Eingabe eines Suchschlüssels einschränken. D.h. ich hab ein Textfeld, in das ein Kriterum eingegen wird.

    Bei einem TextChanged des Textfeldes wird dann folgendes aufgerufen:

    cmdGenre = new OleDbCommand("SELECT DISTINCT Genre FROM Songs WHERE Genre LIKE '" + Suchtext + "*'", con);
    dataGridViewGenre.DataSource = ds.Tables["Genre"];
    

    Doch leider ist das DataGridView danach leer.
    Auch wenn die Abfrage von hand in der Datenbank ein Ergebnis liefert.

    Woran kann das liegen?

    Gruß SkySurfer

    oh und desweiteren was mir auffällt guckmal oben ganz scharf hin
    "Genre" ist doch ein Datenfeld einer Tabelle oder?
    Warum machst Du dan sowas

    ..... .DataSource = ds.Tables["Genre"];
    

    Seid wann ist eine einfache Spalte eine Tabelle?
    ich gehe davon aus Du hattest kurzeitig eine schwachen Moment oder?
    So müsste es gehen

    ..... .DataSource = ds.Tables[0];
    

    da Du eine virtuelle Tabelle bekommst auf Basis einer SQL-Abfrage

    P.S.: Sollten die Namen gewollt sein kann das Ergebnis was bei Dir leer ist
    auch auf einem Namenskonfilkt beruhen, weil Du als Tabellennamen wie auch als Feldnamen "Genre" benutzt.

    Ohne jetzt komplett die restliche Struktur Deines Codes und Deiner DB
    zu kennen sehe ich schlussendlich 1 mögliche Fehlerquelle und ein Designmanko:

    Designmanko

    1. DB nicht richtig normalisiert erkennbar daran
    das Du DISTINCT im Sql verwenden musst nur um zu verhindern das reduntante
    Datensätze zu bekommen. Weil Du bei jedem Titel das Genre angibst was dadurch
    eben reduntant ist. Lösung Eine Tabelle mit Namen Genre anlegen mit 2 Feldern
    Name und Nummer und ein Feld davon als Fremdschlüssel in der Tabelle "Songs"
    verwenden.

    Fehlerquelle

    2. Du verwendest im C#-Code die Zeichenkette "Genre" gleichzeitig als Name fuer
    eine Spalte und fuer eine Tabelle ----> möglicher Namenskonflikt

    hier verwendest Du es als Spalte:

    cmdGenre = new OleDbCommand("SELECT DISTINCT Genre FROM Songs WHERE Genre LIKE '" + Suchtext + "*'", con);
    

    und hier verwendest Du es im C#-Code als Tabelle:

    dataGridViewGenre.DataSource = ds.Tables["Genre"];
    

    Teste es mal so:

    cmdGenre = new OleDbCommand("SELECT DISTINCT Genre FROM Songs WHERE Genre LIKE '" + Suchtext + "*'", con); 
    daGenre = new OleDbDataAdapter(cmdGenre); 
    DataTable dtGenre = new DataTable();
    daGenre.Fill(dtGenre);
    dataGridViewGenre.DataSource = dtGenre;
    

    Ich treffe in der Wahl der Namen fuer Tabellen und Feldnamen immer klar abgegrenzte Bezeichner. Bei Abfragen entstehen ja immer virtuelle Treffermengen
    da benutze ich lieber DataTable zum anzeigen. Im .NET 1.1 hatte ich immer das Problem bei Verwendung von DataSet wurde das Ergebnis der Abfrage immer erst dargestellt indem ich explizit durch einen Klick im DataGrid die Struktur sichtbar wurde. Wenn man per Fill die Ergebnisse in eine DataTable bringt und diese DataTable der DataSource-Eigenschaft zuweisst wird die ergebnissmeng immer sofort im Grid angezeigt.

    So mehr Input kann ich Dir wirklich nicht zur verfügung stellen. Nach langer Grübelei sieht man ja wievielmal ich editiert habe, bin ich mit dem Latein jetzt am Ende.

    Gruss sclearscreen


Anmelden zum Antworten