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. versucht

    dataSet1.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.aspx

    Gruss
    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 es 🙂

    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();
    


  • 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 einfacher 🙂

    Gruss
    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 Zeile

    DataGridViewPos.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


Anmelden zum Antworten