Laden...

DataGridView zu Objektliste konvertieren

Erstellt von tristar vor einem Jahr Letzter Beitrag vor einem Jahr 622 Views
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr
DataGridView zu Objektliste konvertieren

Hallo,

ich habe ein ungebundenes DataGridView, dem ich lediglich Spalten hinzugefügt habe.
Der Nutzer kann dann seine Daten in die Zeilen eintragen.

Nun möchte ich die Daten als Objektliste einlesen, um anschließend speichern zu können.
Meine Frage ist, ob meine Lösung eine "gute" Lösung ist, oder ob es einen besseren Weg gibt?


List<MeineKlasse> list = new List<MeineKlasse>();
foreach (DataGridViewRow row in DataGridView1.Rows)
{
    MeineKlasse obj = new MeineKlasse();
    obj.id = (int)row.Cells["Id"].Value; 
    obj.Name = (string)row.Cells["Name"].Value;
    ...
    list.Add(obj);
}

F
10.010 Beiträge seit 2004
vor einem Jahr

Und warum ungebunden?
Wenn du das sowieso in ein Objekt packst, kannst du auch gleich eine Liste ans Grid binden, dann musst du diesen ganzen Aufwand nicht betreiben.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

Eine leere Liste (List<MeineKlasse>)?

T
2.219 Beiträge seit 2008
vor einem Jahr

Mit dem DataGrid und der Liste hattest du auch schon ein andere Thema.
Sollte also auch nicht neu für dich sein.

Link:
DataGridView sortieren mit IEnumerable<T>

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

Tut mir leid, wenn ich es noch nicht ganz verstanden habe.
Ich kann zwar eine Zeile zur DataTable hinzufügen und auch als Objekt speichern. Das aber nur, wenn ich die Daten z.B. über eine Textbox an die DataGridView übergebe und einfüge.

Meine Frage ist, wie ich es hinzufügen kann, wenn die Daten direkt in die DataGridView eingetragen werden?
Wenn ich bereits eine Liste binde, dann kann der Nutzer direkt nichts ändern ...

16.807 Beiträge seit 2008
vor einem Jahr

Meine Frage ist, wie ich es hinzufügen kann, wenn die Daten direkt in die DataGridView eingetragen werden?
Wenn ich bereits eine Liste binde, dann kann der Nutzer direkt nichts ändern ...

Klar geht das mit Binding. Genau das ist die Idee von Binding.

F
10.010 Beiträge seit 2004
vor einem Jahr

Und du sollst keine DataTable anhängen

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

Hier mal ein Versuche.


private BindingList<Positionen> blPositionen;

void SpaltenAnzeigen()
{
    
    blPositionen = new BindingList<Positionen>();      
    dataGridView1.DataSource = blPositionen;
}

void DatenUebernehmen
{
    blPositionen.Add(new Positionen()
            {
                ArtikelNummer = comboBox1.Text
            }); 
 }

Weshalb werden keine Daten im DataGridView angezeigt?
Muss ich dazu erneut die

BindingList

als

DataSource

setzen?
Oder ist die Art der Umsetzung falsch?

87 Beiträge seit 2016
vor einem Jahr

Hallo,

hilft ein blPositionen.ResetBindings() nach dem hinzufügen.

glandorf

16.807 Beiträge seit 2008
vor einem Jahr

Die BindingList hat gewisse Eigenheiten, basierend auf Windows Forms; wenn sie aktualisiert wird, dann muss sie aus dem richtigen Thread aktualisiert werden, sonst gibts kein Refresh (weil ungültiger UI Zugriff).
Wenn ich mir den Code so ansehe, so wird das null beachtet.

Hinweis:
Die BindingList ist keine ObservableCollection; es gibt keine Auto-Notification.
Willst Du ein automatisches Aktualisieren auch bei Änderung der Inhalte, dann muss Dein Modell (also hier Positionen) ein UI-Modell darstellen, dass INotifyPropertyChanged implementiert.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

Ich habe es nun soweit hin bekommen, dass es läuft.

Nun habe ich aber innerhalb der DataGridView zwei Buttons, um die Positionen hoch und runter verschieben zu können.


  void posIndexUp(DataGridView dg)
        {
            if (dg.SelectedCells.Count > 0)
            {
                int idx = dg.SelectedCells[0].OwningRow.Index;

                if (idx > 0)
                {
                    int col = dg.SelectedCells[0].OwningColumn.Index;

                    DataGridViewRowCollection rows = dg.Rows;
                    DataGridViewRow row = rows[idx];

                    rows.Remove(row);
                    rows.Insert(idx - 1, row);

                    dg.ClearSelection();
                    dg.Rows[idx - 1].Cells[col].Selected = true;
                }
            }
        }

Das geht nun aber nicht mehr, da es datengebunden ist.
Was hätte ich hierzu für Möglichkeiten, um die Positionen verschieben zu können?

4.931 Beiträge seit 2008
vor einem Jahr

Na ja, du mußt die Daten der gebundenen Liste verschieben (d.h. vertauschen).

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

@Th69 Danke, den Denkanstoß hab ich gebraucht 👍
Klappt nun prima!