myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: Windows-Forms (https://www.mycsharp.de/wbb2/board.php?boardid=24)
--- In einer DataGridView suchen (https://www.mycsharp.de/wbb2/thread.php?threadid=122022)


Geschrieben von Adri_C am 11.07.2019 um 20:54:
  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


Geschrieben von Abt am 11.07.2019 um 21:21:
 
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? )


Geschrieben von Adri_C am 11.07.2019 um 21:51:
 
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.


Geschrieben von Abt am 11.07.2019 um 21:55:
 
Zitat von Adri_C:
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.

Zitat von Adri_C:
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.


Geschrieben von Adri_C am 11.07.2019 um 22:15:
 
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.


Geschrieben von Adri_C am 11.07.2019 um 22:21:
 
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.


Geschrieben von Abt am 11.07.2019 um 23:51:
 
Sorry, aber das Forum ist kein kostenloser Quellcodegenerator.
 [Hinweis] Wie poste ich richtig?


Geschrieben von Stefan.Haegele am 12.07.2019 um 07:15:
 
Zitat von Adri_C:
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....


Geschrieben von glandorf am 12.07.2019 um 11:44:
 
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


Geschrieben von Stefan.Haegele am 12.07.2019 um 12:41:
 
Zitat von glandorf:
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?


Geschrieben von Adri_C am 12.07.2019 um 13:28:
 
Zitat von Abt:
Sorry, aber das Forum ist kein kostenloser Quellcodegenerator.
 [Hinweis] Wie poste ich richtig?

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

C#-Code:
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" ?


Geschrieben von Adri_C am 12.07.2019 um 13:37:
 
Zitat von Stefan.Haegele:
Zitat von Adri_C:
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?


Geschrieben von Th69 am 12.07.2019 um 13:42:
 
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:

C#-Code:
DataView dataView = table.DefaultView;
dataGridView1.DataSource = dataView;

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


Geschrieben von Stefan.Haegele am 12.07.2019 um 13:42:
 
Zitat von Adri_C:
C#-Code:
string selectQuery = "SELECT * FROM test.kalorien";

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


Geschrieben von Stefan.Haegele am 12.07.2019 um 13:45:
 
Zitat von Th69:
C#-Code:
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...


Geschrieben von Th69 am 12.07.2019 um 13:52:
 
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?


Geschrieben von Stefan.Haegele am 12.07.2019 um 13:54:
 
Zitat von Th69:
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.


Geschrieben von Abt am 12.07.2019 um 14:20:
 
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.


Geschrieben von Adri_C am 16.07.2019 um 11:58:
 
Zitat von Th69:
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:

C#-Code:
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.


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.07.2019 04:23