# DataGridView füllen



## dumbaz28 (19. Dezember 2009)

Hallo 

Ich arbeite im Moment an einem Projekt (mit C#), bei dem die Daten aus einer SQL-Datenbank (XAMPP) gelesen und in ein DataGridView geladen werden sollen. Der Suchparameter wird in eine Textbox ausgegen. Da ich aber noch nie sonderlich mit DataGridView gearbeitet habe (und mit googlen auch noch nicht schlauer geworden bin) stehe ich im Moment mit meinem Latein am Ende.

In die Textbox soll der Suchbegriff eingegeben werden (ideal wäre natürlich, wenn die Daten wie im Google gleich beim Tippen angezeigt und aktualisiert werden, doch es reicht auch schon, wenn die Daten durch einen Buttonklick angezeigt werden.)

In eine Textbox auslesen klappt prima, da weiß ich auch wie damit umgehen. Habt ihr vielleicht ein paar Begriffe für mich, mit denen ich was anfangen kann oder kurze Codezeilen zum anpassen?

Ich bedank mich jetzt schon mal für euer Bemühen 

lg dumbaz


----------



## Vereth (22. Dezember 2009)

Ich weiß nicht genau, wie du dich mit der Datenbank verbindest; vermutlich über ODBC, da du keine Microsoft SQLServer-Datenbank verwendest. Die notwendigen Klassen findest du im Namespace System.Data und System.Data.Odbc, die du importieren musst. Du machst dann als erstes eine DataTable, wo die Ergebnisse hineingeschrieben werden sollen, die einzelnen Spalten brauchst du nicht zu definieren, das geschieht später automatisch. Dann machst du dir ein OdbcDataAdapter-Objekt, dem du deinen Verbindungsstring und deinen Select-String übergibst; das kannst du im Konstruktor tun. Dann rufst du dessen Fill-Methode auf, mit deiner DataTable als Parameter; dadurch werden die Ergebnisse in die Tabelle geschrieben. Die DataTable gibst du dann als DataSource deines DataGridView an, und das war dann schon alles.
So einfach ist das:

```
using System.Data;
using System.Data.Odbc;

...

{
  ...
  string conn = "hier bitte Verbindungsstring eingeben";
  string command = "SELECT * FROM universum";
  DataTable dt = new DataTable;
  OdbcDataAdapter oda = new OdbcDataAdapter(command,conn);
  oda.Fill(dt);
  // Wenn dein DataGridView nicht dgv heißt, bitte ändern
  dgv.DataSource = dt;
  ...
}
```

PS: Für C# gibt es ein eigenes Unter-Forum


----------



## dumbaz28 (22. Dezember 2009)

erstmal danke für deine antwort. aber ich verbinde über MySql zur Datenbank, und dass klappt mittlerweile problemlos. sieht der code später mit MySql anders aus?


----------



## Vereth (23. Dezember 2009)

dumbaz28 hat gesagt.:


> ich verbinde über MySql zur Datenbank


Kannst du vielleicht nähere Angaben machen?
1.Ist die Datenbank z.B. im Internet ist oder auf deinem lokalen Rechner oder wo?
2. Wie verbindest du dich mit der Datenbank? Mit dem Browser, einem Programm oder wie sonst?
3. Ist es möglich für deine Datenbank einen ODBC-Treiber zu bekommen, den man installieren kann? Wenn ja, dann kannst du den Code übernehmen, ansonsten musst du wahrscheinlich die Klassen aus dem Namespace System.Data.Common verwenden, die aber ähnlich funktionieren. Schau einfach mal in die .NET-Library von http://www.msdn.com (z.B. die Klassenreferenz).


----------



## dumbaz28 (23. Dezember 2009)

also, dass ist der zugriff auf die Datenbank bisher:


```
public string auslesen(string tabelle, string spalte)
        {
            MySqlConnection connection = new MySqlConnection(myConnectionString);
            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT " + spalte + " FROM " + tabelle;

            MySqlDataReader reader;
            connection.Open();
            reader = command.ExecuteReader();
            reader.Read();
            string wert = (Convert.ToString(reader.GetValue(0)));
            reader.Close();

            return wert;
        }
```

Noch ist die Datenbank auf dem lokalen Rechner, aber sobald das Projekt fertig ist, wird sie ins Internet gestellt, das Programm läuft jedoch offline. Da die Datenbank jedoch auch für eine Internet paralell funktionieren muss, wird sie online gestellt.


----------



## vfl_freak (23. Dezember 2009)

Moin,

nur ein kleiner Tipp 

Nutze die Code-Tags bitte mit eckigen anstelle der spitzen  Klammern (also "[]" statt "<>").
Dann klappt's auch mit der Formatierung 

Gruß
Klaus


----------



## dumbaz28 (23. Dezember 2009)

ups, hab gar nicht gesehen dass die formatierung nicht geklappt hat


----------



## vfl_freak (23. Dezember 2009)

Moin,

kein Problem ... der gute Wille wahr ja erkennbar 

Noch ein Tipp in diesem Zusammenhang: 
Du kannst auch im Editor den Button mit der '#' zum Einfügen nutzen.
Noch schöner wird es übrigens, wenn man die Worte CODE durch den entsprechenden Sprachstil (bspw.: JAVA, CPP, PHP etc.) ersetzt 

Gruß
Klaus


----------



## Vereth (4. Januar 2010)

Wenn die Daten per Internet verfügbar sein sollen, solltest du am besten einen WebService implementieren, den du dann gegebenenfalls aufrufst. Dabei rufst du eine Methode mit den notwendigen Parametern auf, diese wird auf dem Server abgearbeitet, verbindet sich mit der Datenbank, ermittelt die Daten und gibt ein DataSet zurück. Anschließend kannst du dann die Ergebnis-Tabelle in deinem DataSet als DataSource deines DataGridView setzen.
Wie du dich in deinem WebService mit der Datenbank verbindest, ist eine andere Sache. Scheinbar hast du eine spezielle Klassenbibliothek für MySQL-Datenbanken; schau mal in der Doku, ob dort auch eine Klasse MySQLDataAdapter hast, ansonsten musst du per DataReader 'per Hand' eine DataTable füllen. Diese fügst du dann mit Hilfe der Add-Methode der Tables-Eigenschaft einem neu erzeugten DataSet hinzu, das du dann als Rückgabewert verwendest.


----------



## dumbaz28 (4. Januar 2010)

also im Moment klappt die Erstellung bereits. Die Datenbank wird erst in einem Monat ins Internet gestellt, falls es dann plötzlich nicht mehr klappt, klingt deine Erklärung plausibel, danke


----------



## dumbaz28 (7. Januar 2010)

neues kleines Problem:

sobald ich in der Form einen neuen Datensatz in die DB eintrage, wird das DataGridView nicht aktualisiert. Gibt es da einen einfachen Befehl? Oder muss ich die gesamte Form neu laden?

So sieht mein Code zum füllen aus:


```
private void Lager_Load(object sender, EventArgs e)
        {

            //Variablen

            DataTable dt = new DataTable("Daten");
            dt.Columns.Add(new DataColumn("Vorname"));
            dt.Columns.Add(new DataColumn("Nachname"));
            dt.Columns.Add(new DataColumn("Geburtsdatum"));

            for (int i = 0; i <= 15; i++)
            {
                AddNewRow(dt, aArtNr[i], aArtikel[i], aBestand[i]);
            }
            dgv.DataSource = dt;
        }

        private void AddNewRow(DataTable dt, string artNr, string artikel, string bestand)
        {
            DataRow dr = dt.NewRow();
            dr[0] = artNr;
            dr[1] = artikel;
            dr[2] = bestand;
            dt.Rows.Add(dr);
        }
```


----------



## Vereth (8. Januar 2010)

Probiere doch mal 


```
// Füge neue Zeile zu DataGridView dgv hinzu
dgv.Rows.Add(dr);
```


----------



## dumbaz28 (8. Januar 2010)

die Funktion "add" habe ich bei AddNewRow dabei? es würde dann doch alles doppelt angehängt werden mit der zusätzlichen Zeile?


----------



## Vereth (8. Januar 2010)

Nicht zusätzlich, statt dessen!
Arbeite nicht mit der DataTable, sondern mit dem DataGridView.


----------



## dumbaz28 (12. Januar 2010)

Ich steh grad voll auf der Leitung. Ich hab jetzt den direkten Zugriff auf das DataGridView versucht. Aber ich scheitere kläglich ): es kommt folgende Fehlermeldung: 
Zum DataGridView-Steuerelement können nur Zeilen hinzugefügt werden, die Spalten enthalten. Die Spalten müssen zuerst hinzugefügt werden.


```
private void Lager_Load(object sender, EventArgs e)
        {
            datenbank datenbank = new datenbank();

            string wArtNr = datenbank.auslesen("lager", "ArtikelNr");      //Wert vom Auslesen in EINEM string
            string wArtikel = datenbank.auslesen("lager", "Artikel");
            string wBestand = datenbank.auslesen("lager", "Bestand");

            string[] aArtNr = wArtNr.Split(',');        //Array 
            string[] aArtikel = wArtikel.Split(',');
            string[] aBestand = wBestand.Split(',');


            DataTable dt = new DataTable("Daten");
            dt.Columns.Add(new DataColumn("Vorname"));
            dt.Columns.Add(new DataColumn("Nachname"));
            dt.Columns.Add(new DataColumn("Geburtsdatum"));

            for (int i = 0; i <= 5; i++)
            {
                DataRow dr = dt.NewRow();
                dr[0] = aArtNr[i];
                dr[1] = aArtikel[i];
                dr[2] = aBestand[i;

                dgv.Rows.Add(dr);
                dgv.Rows.Add(dt, aArtNr[i], aArtikel[i], aBestand[i]);
            }
            //dgv.DataSource = dt;
        }
```


Nochmal zu meinem Problem ... Ich möchte, dass das DataGridView aktuallisiert wird, sobald ich durch die TextBoxen einen neuen Datensatz in die Datenbank eingetragen habe. Zudem hab ich noch ein Problem, ich möchte, wenn ich auf eine Zeile im DataGridView klicke, dass die Werte daraus in den Textboxen stehen, um sie im Bedarfsfall ändern zu können.

Das Projekt sollte bald fertig sein und ich verzweifele echt langsam an diesem DataGridView ): Vielleicht könntet ihr mir nochmal weiterhelfen.

Vielen vielen Dank


----------



## Vereth (13. Januar 2010)

Die Fehlermeldung scheint ein wenig irreführend zu sein. Das passiert bei C# aber öfter.
Du möchtest wahrscheinlich die alten Inhalte verwerfen und das DataGridView mit einer neu erstellten Tabelle füllen. In dem Falle ist es besser, wenn du die Datenzeilen in eine neu erstellte Tabelle schreibst und danach diese als DataSource des dgv angibst. Dann hast du nämlich beim Programmlauf keine Verzögerungen durch unnötige Bildschirm-Refreshs.
Wenn du aber die ursprünglichen Inhalte behalten willst, dann brauchst du keine neue Tabelle, sondern fügst die neuen Zeilen direkt dem DataGridView hinzu; die dazugehörige Tabelle wird dadurch automatisch aktualisiert.
Deine Fehlermeldung resultiert wahrscheinlich aus der Tatsache, dass dein DataGridView noch keine DataSource hat.
Außerdem solltest du darauf achten, dass du für die Spalten auch die passenden Datentypen verwendest. Es macht keinen Sinn, wenn du beispielsweise einem int-Wert (z.B. Warenanzahl) einen String zuweist. Auch für Datumsangaben gibt es einen eigenen Datentyp DateTime.
Du brauchst für das manuelle Eingeben oder Ändern einer neuen Datenzeile keine zusätzlichen Steuerelemente. Das kannst du direkt im DataGridView machen.


----------

