Laden...

In einer DataGridView suchen

Erstellt von Adri_C vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.881 Views
A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren
In einer DataGridView suchen

verwendetes Datenbanksystem: <MySql>

Hallo zusammen,

ich bin ziemlich frisch mit C# unterwegs.

Ich habe eine MySql Datenbank erstellt und rufe die Daten in einer DataGridView ab. Kann dann Zeilen markieren und diese markierten Zeilen dann in Textboxen darstellen. Kann neue Datensätze erstellen, ändern und auch Datensätze Löschen.

Jetzt möchte ich noch über eine Textbox in den Daten suchen und die DataGridView soll mir dann die entsprechenden Daten anzeigen. Wenn die Textbox wieder leer ist sollen dann auch wieder alle Datensätze gezeigt werden.

Na ja wenn ich wüste wie man hier mehr Daten hochladen kann würde ich euch das gesamte Projekt hochladen (VisualStudio2017)
Ich hoffe das das Bild mit dem was ich zum start vor habe auch angezeigt wird

Ich hoffe ihr konntet mich etwas verstehen und gebt mir auch noch ein paar Tips zum Posten von Fragen.

Grüße

Adrian

16.807 Beiträge seit 2008
vor 4 Jahren

Suchen sollte man eigentlich in den Daten, nicht in der UI.
Alle Daten, die dann den Kriterien entsprechen, bindet man dann in der UI.
[Artikel] MVVM und DataBinding (gilt auch für Windows Forms, wenn auch dort eher via MVP Pattern).

Ansonsten hast Du keine Frage in Deinem Beitrag gestellt, die man beantworten könnte.
(Bitte auch nicht das Projekt hochladen, siehe [Hinweis] Wie poste ich richtig? )

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

na ja doch die DataGridView ist ja voll mit Daten ich möchte jetzt in der oberen Textbox mein Suchbegriff schreiben. Sobald ein erster Buchstabe geschrieben ist soll in der DataGridView nur noch die Datensätze dargestellt werden die im Namen den entsprechenden Buchstaben haben.

Wenn ich das richtig verstehe dann sollte man in den Daten selbst suchen und nicht in einer Komponente wo die Daten dargestellt werden?!

Habe jetzt an dem jetzigen stand eine Ewigkeit gesessen um es so hin zu bekommen und jetzt habe ich absolut keine Idee wie ich das suchen gestalten soll.

16.807 Beiträge seit 2008
vor 4 Jahren

Wenn ich das richtig verstehe dann sollte man in den Daten selbst suchen und nicht in einer Komponente wo die Daten dargestellt werden?!

Prinzipiell ja. Es ist bei vielen vielen Daten gar nicht möglich, alle in die UI zu laden.
Das macht a) wenig sinn, weil es kein User überblicken könnte und b) hast Du einfach Limits wie den Arbeitsspeicher oder ganz einfach die Performance, dass Du gar nicht alles laden kannst.

Habe jetzt an dem jetzigen stand eine Ewigkeit gesessen um es so hin zu bekommen und jetzt habe ich absolut keine Idee wie ich das suchen gestalten soll.

Google-Suche nach c# datagridview search filter
Gibt tausende Treffer wie eine einfache, GridView-basierte Filterfunktion (eben mit den Limits) funktioniert.

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

Ja das ist verständlich das man bei sehr vielen Daten diese nicht in einer DataGridView darstellt macht keinen Sinn bei fast unendlich vielen Daten.

Ja das Blöde ist das die meisten Beispiele immer mit den vorbereiteten Funktionen in VisualStudio funktionieren wie zum Beispiel "BindingSource" und "BindingNavigator" und dann kann man die Daten schön über entsprechende Menüführungen verbinden.

Das mag gut funktionieren wenn man SQL Datenbanken verwendet bei MySql klapt da bei mir garnischts.

Habe mir ein Buch gekauft C# und MySql und das ganze Buch ist mit diesen "BindingSource" und "BindingNavigator" aufgebaut was nichts nützt.

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

Ach ja wer das gesamte Projekt haben möchte dem schicke ich es natürlich gerne.

Es muss dann nur die entsprechende Datenbank in mySql erstellt werden.

16.807 Beiträge seit 2008
vor 4 Jahren

Sorry, aber das Forum ist kein kostenloser Quellcodegenerator.
[Hinweis] Wie poste ich richtig?

463 Beiträge seit 2009
vor 4 Jahren

Das mag gut funktionieren wenn man SQL Datenbanken verwendet bei MySql klapt da bei mir garnischts.

Was hindert dich dann auf MS SQL umzusteigen? Die Express Version ist sogar kostenlos....

87 Beiträge seit 2016
vor 4 Jahren

Hallo,

sind deine Daten, die in der DataGridView angezeigt werden, in einer DataTable?

Wenn ja, DataTable hat eine DefaultView Eigenschaft und diese lässt sich filtern.

glandorf

463 Beiträge seit 2009
vor 4 Jahren

sind deine Daten, die in der DataGridView angezeigt werden, in einer DataTable?
glandorf

Damit löst er aber nicht das Problem, dass er auf der Datenquelle filtern sollte und nicht erst auf dem Client... Warum unnötige Daten auf den Client übertragen?

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

Sorry, aber das Forum ist kein kostenloser Quellcodegenerator.

>

Entschuldige du musst dich nicht so fühlen als müsstest du mir einen Quelltext schreiben. Das möchte ich schon alleine und vor allem irgendwann auch verstehen.

glandorf danke für dein Diskussionsbeitrag! Ja meine Daten sind in einem DataTable

 
string selectQuery = "SELECT * FROM test.kalorien";  // Hier wird ein String aus der Datenbank 
                                                                              // selectiert
DataTable table = new DataTable();                          // Erzeugt eine Tabelle
MySqlDataAdapter adapter = new MySqlDataAdapter(selectQuery, connection); //Adapter mit 
                                                                                       // globalem 
                                                                                      // Zugriff auf den Server und Selektion 
                                                                                      //aus der Datenbak
adapter.Fill(table); // Der Adapter wird mit der Tabelle gefüllt
dataGridView1.DataSource = table; // Zuordnung der Datasource der GridView mit der Tabelle

Da werde ich mal intensiver hinsehen denn im ersten Schritt würde mir das Filtern in der gesamten dargestellten Tabelle (sind ja nicht so viele Daten) helfen.
Aber es ist natürlich interessant sich nur die Gefilterten Daten aus der Datenbank zu holen. Das meint ihr doch mit:

"dass er auf der Datenquelle filtern sollte und nicht erst auf dem Client" ?

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

Das mag gut funktionieren wenn man SQL Datenbanken verwendet bei MySql klapt da bei mir garnischts.

Was hindert dich dann auf MS SQL umzusteigen? Die Express Version ist sogar kostenlos....

Ja gute Frage ich habe mich für MySql entschieden da ich mir für zu hause eine NAS-Festplatte (Synology) zulegen möchte um darauf die Datenbank abzulegen. Da habe ich gelesen kann ich nur eine MySql Datenbank ablegen und aus diesem Grunde habe ich versucht mich in MySql einzuarbeiten.

Aber danke werde mir mal die Express Version von SQL ansehen. Vielleicht geht's ja doch auf einer NAS-Festplatte?

4.931 Beiträge seit 2008
vor 4 Jahren

So wie glandorf geschrieben hat, kannst du mittels DataView.RowFilter die Daten filtern, s.a. DataView RowFilter Syntax [C#].

Für dich also so in etwa:


DataView dataView = table.DefaultView;
dataGridView1.DataSource = dataView;

dataView.RowFilter = "Name LIKE '%" + textBoxSearch.Text + "%'";

463 Beiträge seit 2009
vor 4 Jahren
   
string selectQuery = "SELECT * FROM test.kalorien";   

Das ist der Supergau einer jeden SQL Afrage - und für mich ein absolutes NoGo

463 Beiträge seit 2009
vor 4 Jahren
  
DataView dataView = table.DefaultView;  
dataGridView1.DataSource = dataView;  
  
dataView.RowFilter = "Name LIKE '%" + textBoxSearch.Text + "%'";  
  

Schon richtig, aber er lädt ja trotzdem erst mal alle Daten zum Client - eine Filterung auf SQL-Server Ebene ist doch viel einfache rund effektiver...

4.931 Beiträge seit 2008
vor 4 Jahren

Aber wenn doch zu Beginn erst alle Daten geladen werden und dann optional nach einem Namen gefiltert werden können?
Und mit einer leeren Suchmaske sollen ja wieder alle Daten angezeigt werden. Warum also jedesmal eine neue Datenbankabfrage starten?

463 Beiträge seit 2009
vor 4 Jahren

Warum also jedesmal eine neue Datenbankabfrage starten?

Das mag bei kleinen DB akzeptabel sein - aber was wenn die Datenbank mal ein paar Einträge mehr hat? Ich finde es ein NoGo immer erst alles auf den Clinet zu übertragen und dann dort zu filtern.

Meine Vorgehensweise wäre:

Leere Maske zum Start - danach wird mit Suchstring selektiert und dargestellt.

16.807 Beiträge seit 2008
vor 4 Jahren

Der Mehraufwand das richtig, ordentlich zu machen ist so gering, dass es für Client-side Filtering quasi kaum eine Rechtfertigung gibt.
Vor allem auch, da der eingebaute Filtermechanismus sehr eingeschränkte Funktionalitäten hat.

A
Adri_C Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

So wie glandorf geschrieben hat, kannst du mittels DataView.RowFilter die Daten filtern, s.a.
>
.

Für dich also so in etwa:

  
DataView dataView = table.DefaultView;  
dataGridView1.DataSource = dataView;  
  
dataView.RowFilter = "Name LIKE '%" + textBoxSearch.Text + "%'";  
  

Das hat ja erstmal sehr gut funktioniert!

Ich melde mich erst so spät da ich versucht habe sql zu installieren das waren ganze zwei Tage und alles für umsonst dan bin ich wieder zurück auf mysql und habe den Row.Filter getestet.