Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DataGridView zu Objektliste konvertieren
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

DataGridView zu Objektliste konvertieren

beantworten | zitieren | melden

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);
}
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.008

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

Eine leere Liste (List<MeineKlasse>)?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

Grundlagen: Overview of Data Binding and Windows Forms - Windows Forms .NET
Gibts alternativ auch für WPF Übersicht über Datenbindung - WPF .NET
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.117
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

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 ...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.008

beantworten | zitieren | melden

Und du sollst keine DataTable anhängen
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 85
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

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

glandorf
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.643

beantworten | zitieren | melden

Na ja, du mußt die Daten der gebundenen Liste verschieben (d.h. vertauschen).
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

@Th69 Danke, den Denkanstoß hab ich gebraucht
Klappt nun prima!
private Nachricht | Beiträge des Benutzers