Laden...

Suchen in Datenbank

Erstellt von Hero vor 14 Jahren Letzter Beitrag vor 14 Jahren 5.345 Views
H
Hero Themenstarter:in
22 Beiträge seit 2006
vor 14 Jahren
Suchen in Datenbank

Hallo Leute!

Habe ein suche erstellt wo ich nach Buchtiteln suchen kann. Klappt auch fast 😁 , nur er findet ein ganz anderen Datensatz, aber nicht den ich wollte.
Hier der Code:


        private void bt_titelfind_Activate(object sender, EventArgs e)
        {
            string titel = cb_find.Text;
            dsBook1.Tables[0].DefaultView.Sort = "Titel";
            int r = dsBook1.Tables[0].DefaultView.Find(titel);
            
            if (r != -1)
            {
                view.FirstDisplayedScrollingRowIndex = r; // view  -> DataGridView
                view.Rows[r].Selected = true;
            }
            else
            {
                MessageBox.Show("Titel nicht gefunden !", "Buchverwaltung");
            }
        }

Habt ihr eine Idee was ich verkehrt gemacht habe ? Für ein paar Tips wer ich dankbar.

mfg

149 Beiträge seit 2006
vor 14 Jahren

Hallo Hero,

ich finde die Methode wie du einen Buchtitel, der wie ich vermute in einer Datenbank steht, suchst. Wieso löst du das Problem nicht in dem du mit einem SQL Statement gegen die Datenbank gehst?

Könnte es dran liegen das an das Datagridview ein ganz anderes Dataset gebunden ist wo der Index nicht überein stimmt?

Die Methode ist auf jedenfall seltsam 😃

Gruß
Robert

5.299 Beiträge seit 2008
vor 14 Jahren

@roeb: na, wenn die Daten schon im Dataset sind, also beim Client, dann sollte man m.E. keinesfalls auffm Server danach suchen.

@Hero:
könnte mir vorstellen, das DGV ist über ein anderes DataView an die Daten gebunden, als über Tables[0].DefaultView.

Wenn du DefaultView.Sort setzt - sortiert sich denn dann das DGV entsprechend um?

Der frühe Apfel fängt den Wurm.

1.564 Beiträge seit 2007
vor 14 Jahren

Ich hab's bei mir auch mal nachvollzogen (mit DefaultView gebunden) sollte meiner Meinung nach schon funktionieren, da sich das DataGridView automatisch nach "Title" sortiert und der zurückgelieferte Index korrekt ist. Tut's aber nicht.

@ErfinderDesRades
Grundsätzlich korrekt. Wenn ich die Daten eh schon im Client sind kann man sie auch verwenden, trotzdem ist roeb's Einwand korrekt. Es kommt halt auf die größe der Datenbank an und ob wirklich schon alles beim Client ist (oder überhaupt sein muss). Ich habe in meinem Projekt derzeit Datenbanken mit über 300GB, das wäre dann schon ein echter Fat-Client 😁

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

5.299 Beiträge seit 2008
vor 14 Jahren

8o 300GB - so viele Bücher gibts ja garnet!

Nee, weiler im Code das DGV zum gesuchten Datensatz hinscrollen will, gehe ich davon aus, daß die Daten beim Client sind.

Ist ja ein erstaunliches Verhalten vom Defaultview.

Als User würde ich eh keinen Gebrauch von soner Suche machen. Ich würd die Titel-Spalte klicken, sodaß das DGV sich nach Titeln sortiert, und dann würde ich selbst nach meinem titel suchen, per Scrollbalken, weil ich kann das Alphabet 😁

So richtig mit DefaultViews kennichmich auch gar nicht aus. Ich mach immer mit BindingSources, und mein neulicher Versuch damit verlief zufriedenstellend.


            FotoBindingSource.Position = FotoBindingSource.Find("File", "Img13.jpg")

Der frühe Apfel fängt den Wurm.

1.564 Beiträge seit 2007
vor 14 Jahren

8o 300GB - so viele Bücher gibts ja garnet!

Naja, bei mir nicht, aber sonst... Ich kenne ja Heros Datenbank nicht, wenn nicht nur die Titel sondern u.a. auch der Inhalt enthalten ist sind 300GB oder mehr gar kein Problem.

Nee, weiler im Code das DGV zum gesuchten Datensatz hinscrollen will, gehe ich davon aus, daß die Daten beim Client sind.

Wollte nur sagen, dass auch roebs Aussage durchaus korrekt war. 😉

Als User würde ich eh keinen Gebrauch von soner Suche machen. Ich würd die Titel-Spalte klicken, sodaß das DGV sich nach Titeln sortiert, und dann würde ich selbst nach meinem titel suchen, per Scrollbalken, weil ich kann das Alphabet 😄

Ich habe etwas ähnliches auch anders realisiert. Statt den Datensatz einfach nur anzuspringen nutze ich einen Filter um die gesammte Anzeige auf die gefundenen Ergebnisse einzuschränken. Funktioniert erschreckend gut.

So richtig mit DefaultViews kennichmich auch gar nicht aus. Ich mach immer mit BindingSources, und mein neulicher Versuch damit verlief zufriedenstellend.

  
            FotoBindingSource.Position = FotoBindingSource.Find("File", "Img13.jpg")  

Korrektamundo. DataTable und DataView sind wirklich nett haben aber manchmal Ihre Grenzen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

H
Hero Themenstarter:in
22 Beiträge seit 2006
vor 14 Jahren

Hallo!

Danke Euch für die Hilfe. Habe es hinbekommen.


        private void bt_titelfind_Activate(object sender, EventArgs e)
        {
            DataView view1 = new DataView(dsBook1.Tables[refs.Book]); // refs.Book -> Tabelle
            BindingSource bs = new BindingSource();
            bs.DataSource = view1;
            view.DataSource = bs;  //view -> DGV

            int f = bs.Find("Titel", cb_find.Text);

            if (f != -1)
            {
                view.FirstDisplayedScrollingRowIndex = f;
                view.Rows[f].Selected = true;
            }
            else
            {
                MessageBox.Show("Titel nicht gefunden !", "Buchverwaltung");
            }
        }

mfg

5.299 Beiträge seit 2008
vor 14 Jahren

bischen ausgemistet 😉


        private void bt_titelfind_Activate(object sender, EventArgs e)
        {
            BindingSource bs = new BindingSource(dsBook1, refs.Book);
            bs.Position = bs.Find("Titel", cb_find.Text);
            view.DataSource = bs;  //view -> DGV

            if (bs.Position<0)
            {
                //scrollt + selektiert doch autom. , bei nichtfinden deselektierter korrekt
                MessageBox.Show("Titel nicht gefunden !", "Buchverwaltung");
            }
        }

(Und für c# macht der c# - Tag hübschere Posts als der Code-Tag)

Ist aber iwie unerfreulich zu die Ressourcen.
Einfacher tut man die BindingSource aufs Form, und stellt ihre Bindung ein (oder per Code im Form-Konstruktor).

Nicht bei jedem Suchvorgang eine neue Bindingsource erstellen (zumal die alte ja nicht mal ordentlich disposed wird).
Auch die Bindung des DGVs nur einmal festlegen, nicht bei jedem Klicks

Im Designer zugefügte Komponenten - da kümmert sich der Designer ums Disposen (außer beim Dataset)

Ja, wenn man so verfährt, bleibt nur noch dieses übrig:


        private void bt_titelfind_Activate(object sender, EventArgs e)
        {
            bookBindingSource.Position = bookBindingSource.Find("Titel", cb_find.Text);
            if (bookBindingSource.Position<0)MessageBox.Show("Titel nicht gefunden !", "Buchverwaltung");
        }

Der frühe Apfel fängt den Wurm.