Autor Beitrag
Doug123
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Di 22.07.08 12:48 
Hallo!

Ich habe mal eine Frage zur Vorgehensweise beim Laden der Daten aus einer SQL-Datenbank. In meinem Programm habe ich ein Fenster mit einem TabControl drauf. Im ersten Register befindet sich ein DGV, welches ich ganz normal fülle. Sprich ich hole mir per "DataAdapter.Fill" die Daten aus der Datenbank und weise das DataSet nachher einer BindingSource zu, welche ich dann ans DGV binde. Das klappt auch alles soweit.

Nun möchte ich eine zweite Tabelle im zweiten Register (auch in einem DGV) anzeigen. Diese Daten sind jeweils einem Datensatz aus der ersten Tabelle zugeordnet. D.h., wenn ich auf die zweite Tablasche wechsel, sollen die dazugehörigen Datensätze ermittelt und angezeigt werden.

Nun zu meiner Frage:
Erstellt man sich da am besten eine Methode, in der man immer eine DataTable als Rückgabewert erhält und bindet diese ans DGV oder wie würdet ihr das machen?

Gruß
Doug
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 22.07.08 13:42 
Da ich gerade so eine Methode selbst geschrieben habe, schenke ich sie dir mal -)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
private bool ReadData(string sQuery, IDbDataAdapter da, DataSet dataset)
{
    using(SqlConnection sqlConn = new SqlConnection(sConnection))
        using(SqlCommand sqlCmd = sqlConn.CreateCommand())
        {
            sqlCmd.CommandText = sQuery;
            sqlConn.Open();

            dataset.Reset();
            da.SelectCommand = sqlCmd;
            da.Fill(dataset);

            return dataset.Tables != null && dataset.Tables[0] != null;
        }
}

// Aufruf dann mit
private SqlDataAdapter daUsers = new SqlDataAdapter();
private DataSet datasetUsers = new DataSet();

private void ReadUsers()
{
     string sQuery = "select * from Users";
     if(ReadData(sQuery, daUsers, datasetUsers))
     {
         dataGridViewUsers.DataSource = datasetUsers.Tables[0];
     }
}

Alternativ kann die Methode ReadData() auch gleich die Tabelle zurückliefern (oder null) und du kannst direkt die Bindung durchführen (alternativ auch über eine BindingSource).

Bei Tabwechsel mußt du dann nur den aktuellen Datensatz (der ersten DGV) ermitteln und mit dem entsprechend modifizierten Select-Statement dann deine angepaßte ReadUsers() aufrufen (ich habe bei mir Users und UserActions).
Doug123 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 23.07.08 15:10 
Danke für deine Antwort....hat mir sehr geholfen!

Habe bei mir wohl noch eine neue BindingSource eingebaut und diese dann ans zweite DGV gebunden.


Eine Frage hätte ich da aber noch:

Die Tabelle, die an das zweite DGV gebunden ist, ist dazu da um auch Dokumente abzuspeichern. Also ich zeige im DGV nur die Dokumentnamen usw. an. Was müsste ich denn machen, um einen neuen Datensatz abspeichern zu können?

Müsste ich 1. ganz normal einen neuen Datensatz in der DataTable anlegen (mit den Bezeichnungen usw.) und diesen in die Datenbank schreiben und danach danach dann als 2. Schritt nochmal extra die Datei per "ExecuteNonQuery" in das Datenfeld der Tabelle schreiben?


Vielen Dank nochmal!

Gruß
Doug