Befüllen eines DataGridViews und DataTable / DataGrid
-
Hallo
ich hab schon hier im Forum gesucht und auch in der MSDN geschaut, aber so richtig hab ich keine Lösung für mein Problem gefunden.
Ich habe ein DataGridView, was ich zeilenweise befüllen möchte. Dazu habe ich gelesen man soll ein DataTable verwenden. Die manuelle Deklaration hat nicht so funktioniert wie ich das gern hätte.
Also hab ich ein DataSet auf meine Form gezogen (hab damit schonmal eine AccessDB ausgelesen). Habe dann eine Tabelle "dtPositionen" hinzugefügt. Dieser wiederum habe ich 5 Colums unterschiedlichen Typs hinzugefügt...meinetwegen Column1...Column5.
Aber ich bekomme es nicht hin nun die einzelnen Felder zu füllen.
Hab z.B. versuchtdataSet1.Tables["dtPositionen"].Columns["cService"].
Aber weiter ging es eben nich. Da war keine Eigenschaft Value oder so...
Also wie weise ich den einzelnen Feldern Werte zu?
Wie füge ich dann neue Datensätze der Tabelle hinzu?
Und was muss ich beachten, wenn ich den DataSet in der GridView anzeigen möchte? Muss da so etwas wie ein Update() gemacht werden?Liebe Grüße
- Sebastian
-
Hallo,
wenn du die ganze Tabelle anzeigen lassen willst, ist es wahrscheinlich am einfachsten, wenn du über den Designer die DB einbindest (neue Datenquelle).
Dann kannst du die Tabelle auswählen und sie per Drag&Drop auf deine From ziehen.
Dadurch bekommst du direkt ein DataGridView, Dataset, DatasetBindingsource und DatasetAdapter.Wie das alles funktioniert, kannst du dir hier mal anschauen:
http://windowsclient.net/learn/videos.aspxGruss
Styx
-
Ich hab es hinbekommen.
Habe ein DataSet erstellt, da eine Tabelle kreiert und darin Spalten...
Und mit dem Code hier kann ich nun die Tabelle befüllen und das GridView aktualisieren. Ist sicherlich nicht die beste Methode, aber im Moment funktioniert esdataSet1.Tables["dtPositionen"].Rows.Add(iPositionen, StrService, iMenge, dPreis.ToString("C"), dGesamtPreis.ToString("C")); DataGridViewPos.Rows.Add(dataSet1.Tables["dtPositionen"].Rows[iPositionen - 1].ItemArray); if (iPositionen > 4) { DataGridViewPos.Columns["TBCService"].Width = 583; } DataGridViewPos.Update();
-
Ich würd mir trotzdem mal die Sache mit der "Datenquelle" anschauen.
Damit kann man sich einiges an selbst geschriebenen Code ersparen ;).
Ausserdem wird der Umgang mit der DB ansich wesentlich einfacherGruss
Styx
-
Ich habe das eben mal versucht. Ich will ja weder eine Datenbank anbinden noch eine Webdatenbank/Quelle, sondern ein Objekt. Allerdings kann ich wenn ich das Objekt System.Data.DataSet auswähle keine weiteren Einstellungen vornehmen, die mich Tabellen und Felder kreieren lässt...
Ich habe auch eben versucht mal alle Datensätze aus dem Dataset per Knopfdruck zu löschen und dann wieder das Grid zu aktualisieren:
Int32 anzahl = dataSet1.Tables["dtPositionen"].Rows.Count; MessageBox.Show(anzahl.ToString()); for (int i = 0; i==anzahl ; i++) { dataSet1.Tables["dtPositionen"].Rows.RemoveAt(anzahl - i); //funktioniert nicht dataSet1.Tables["dtPositionen"].Rows[i].Delete(); //funktioniert nicht dataSet1.Tables["dtPositionen"].Rows.Clear();//funktioniert nicht } DataGridViewPos.Update();
Hat jemand einen Tip/hinweis was und warum es nicht funktioniert? Die Anzahl der Datensätze wird noch korrekt ausgegeben...
Liebe Grüße
- Basti
-
Ok... mit Objekten funktioniert das alles aber auch...
Als erstes erstellst du eine Form.
Dann addest du zu deinem Project ein weiteres, diesmal aber eine ClassLibrary.
Dort kannst du dann deine Attribute erstellen:Public Class Person Private _vorname As String Private _nachname As String Private _addresse As String Public Property Vorname() Get Return _vorname End Get Set(ByVal value) _vorname = value End Set End Property Public Property Nachname() Get Return _nachname End Get Set(ByVal value) _nachname = value End Set End Property Public Property Addresse() Get Return _addresse End Get Set(ByVal value) _addresse = value End Set End Property End Class
Bitte einmal builden, damit du die .dll auch hast.
Dann gehst du auf Data und fügst eine neue Datenquelle hinzu. Ganz rechts kannst du dann Object auswählen.
Als nächstes füge eine Reference auf deine ClassLibrary hinzu.
Dann kannst du deine Klasse als Object auswählen.Wähle aus dem Data Source Fenster deine Klasse und ziehe sie auf deine Form.
Das wars dann auch schon fast...
Hier ein Beispiel, wie du die Datagridview mit Daten füllen kannst:imports ClassLibrary Public Class Form1 Dim testArr As New List(Of Person) Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim test As New c test.addresse = "Test" test.nachname = "Test" test.vorname = "Test" Dim test1 As New Person test1.Addresse = "Test1" test1.Nachname = "Test1" test1.Vorname = "Test1" testArr.Add(test) testArr.Add(test1) PersonBindingSource.DataSource = testArr End Sub End Class
Du musst dann die delete, insert Buttons enablen um Daten löschen bzw. hinzufügen zu können. Dafür brauchst du dann auch keinen weitern Code.
Hoffe es hilft dir weiter...
Gruss
Styx
-
Guten Morgen,
Okay, danke Styx, das werde ich mal versuchen.
Aber mich würde jetzt trotzdem mal interessieren, warum mein DataGridView sich nicht nochmal die akruellen Datensätze aus der DataTable holt und seine Rows dementsprechend anpässt?
Die Rows der DataTable werden ja gelöscht, laut MessageBox.Show().
Ich habe auch schon in der MSDN nachgelesen zur DataGridView und einige Methoden getestet aber nie hat es geklappt...
Was mach ich da noch falsch?Mein Quelltext sieht im Moment so aus:
private void ButtonAdd_Click(object sender, EventArgs e) //hier wird in die Datatable hizugefügt { Int32 iMenge; Double dPreis, dGesamtPreis, dRabatt; String StrService; iMenge = Int32.Parse(TextBoxMenge.Text); if (iMenge > 0) { iPositionen += 1; StrService = Kategorie + " - " + TextBoxService.Text; dRabatt = double.Parse(TextBoxRabatt.Text.ToString()); dPreis = Double.Parse(TextBoxPreis.Text.Replace("€", " ")); if (TextBoxStrecke.Text != "") { iMenge = Int32.Parse(TextBoxStrecke.Text.ToString() ); StrService += " (" + TextBoxStrecke.Text.ToString() + ")km"; } dPreis -= dPreis * (dRabatt / 100); Math.Round(dPreis, 2); dGesamtPreis = dPreis * iMenge; dataSet1.Tables["dtPositionen"].Rows.Add(iPositionen, StrService, iMenge, dPreis.ToString("C"), dGesamtPreis.ToString("C")); DataGridViewPos.Rows.Add(dataSet1.Tables["dtPositionen"].Rows[iPositionen - 1].ItemArray); if (iPositionen > 4) { DataGridViewPos.Columns["TBCService"].Width = 583; } DataGridViewPos.Update(); } } private void button3_Click(object sender, EventArgs e) //hier soll gelöscht werden { Int32 anzahl = dataSet1.Tables["dtPositionen"].Rows.Count; MessageBox.Show(anzahl.ToString()); for (Int32 i = 0; i<=anzahl ; i++) //Überbleibsel aus Test-Läufen { //dataSet1.Tables["dtPositionen"].Rows.RemoveAt(anzahl - i); //dataSet1.Tables["dtPositionen"].DataSet.Tables["dtPositionen"].Rows.Clear(); //dataSet1.Tables["dtPositionen"].Rows[0].Delete(); //dataSet1.Tables["dtPositionen"].Rows.Clear(); dataTable1.Rows.Clear(); } ControlsBefuellen(1, 0, 0,0,""); iPositionen = 0; }
Liebe Grüße
- Basti
-
Ich würde sagen, du solltest dich mal ein wenig näher mit der Materie (Dataset, DataGridview, DataGridview.DataSource, DataBindingSource, etc.) befassen.
Du musst dein DataGridView nicht per Hand aktualisieren. Mach es einfach so:
dim ds as new Dataset ds.Tables.Add("Test") Dim col As New DataColumn("TestCol") ds.Tables("Test").Columns.Add(col) ds.Tables("Test").Rows.Add("Test") ds.Tables("Test").Rows.Add("Another1") ds.Tables("Test").Rows.Add("Another2") ds.Tables("Test").Rows.Add("Another3") ds.Tables("Test").Rows.Add("Another4") DataGridView1.DataSource = ds.Tables("Test")
Dann kannst du im Button Event einfach sagen:
ds.Tables("Test").Rows.RemoveAt(Position)
Mit einem zweiten Button kannst du auch Rows hinzufügen:
ds.Tables("Test").Rows.Add("NewRow")
Das DataGridview in deiner Form wird sich automatisch aktualiesieren.
Gruss
Styx
-
Das habe ich getan...
Habe in der Eigenschaft der DataGrid das dataSet eingetragen.
Dadurch wurde diese ZeileDataGridViewPos.Rows.Add(dataSet1.Tables["dtPositionen"].Rows[iPositionen - 1].ItemArray);
überflüssig. Aber jetzt reagiert die Grid garnicht mehr auf Eingaben in das DataSet.... ich krieg ne Macke hier
Ok, also das hier ist der Code:
private void ButtonAdd_Click(object sender, EventArgs e) { Int32 iMenge; Double dPreis, dGesamtPreis, dRabatt; String StrService; iMenge = Int32.Parse(TextBoxMenge.Text); if (iMenge > 0) { iPositionen += 1; StrService = Kategorie + " - " + TextBoxService.Text; dRabatt = double.Parse(TextBoxRabatt.Text.ToString()); dPreis = Double.Parse(TextBoxPreis.Text.Replace("€", " ")); if (TextBoxStrecke.Text != "") { iMenge = Int32.Parse(TextBoxStrecke.Text.ToString() ); StrService += " (" + TextBoxStrecke.Text.ToString() + ")km"; } dPreis -= dPreis * (dRabatt / 100); Math.Round(dPreis, 2); dGesamtPreis = dPreis * iMenge; dataSet1.Tables["dtPositionen"].Rows.Add(iPositionen, StrService, iMenge, dPreis.ToString("C"), dGesamtPreis.ToString("C")); //DataGridViewPos.Rows.Add(dataSet1.Tables["dtPositionen"].Rows[iPositionen - 1].ItemArray); if (iPositionen > 4) { DataGridViewPos.Columns["TBCService"].Width = 583; } //DataGridViewPos.Update(); } }
dataSet1 enthält die Tabelle "dtPositionen" mit 5 Columns, die halt gefüllt werden (dataSet1.Tables["dtPositionen"].Rows.Add() )
Mein DataGridView heist "DataGridViewPos" und der habe ich 5 Columns in die Eigenschaften eingetragen und als DataSource das dataSet1, und ansonsten ist es noch auf readOnly gesetzt....
Weis nicht ob das irgendjemandem hilft
-
Versuchs mal so...
Du löscht die Columns aus dem DataGridView...
Dann machst du so was wie:ds.Tables("Test").Columns.Add("Col1") ds.Tables("Test").Columns.Add("Col2") ds.Tables("Test").Columns.Add("Col3") ds.Tables("Test").Columns.Add("Col4") ds.Tables("Test").Columns.Add("Col5")
Damit hast du der Tabelle Spalten hinzugefügt.
Jetzt fügst du Reihen ein:ds.Tables("Test").Rows.Add("Test","Test","Test","Test","Test")
Jetzt noch:
DataGridView.DataSource = ds.Tables("Test") // nicht ds sondern die Tabelle zuweisen
und fertig.
Dem DataGridView werden automatisch die Spalten zugewiesen(du brauchst sie also nicht noch einmal in den Eigenschaften definieren).
Das Dataset sollte natürlich eine Variable sein, die in der gesamten Klasse zugänglich ist. Die Initialisierung der Tabelle und Spalten solle in der Load() Funktion geschehen.
Dann sollte alles klappen.
Ich hoffe, ich habe dein Problem richtig erkannt.Gruss
Styx