Laden...

Listview mit Daten aus einer eigenen Klasse füllen

Erstellt von POLI vor 5 Jahren Letzter Beitrag vor 5 Jahren 3.181 Views
P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren
Listview mit Daten aus einer eigenen Klasse füllen

Hi,

bin relativ neu in der C# Welt (Vorab :tongue🙂

Ich habs leider nicht ganz raus, wie ich meine Listview mit Daten aus einer eigenen Klasse füllen kann.
Und das möglichst dynamisch.

Die Columns der Listview setze ich bereits dynamisch:

        private bool listViewInit(ref ListView ls)
        {
            ls.View = View.Details;
            UBSPMVorgang ubsV = new UBSPMVorgang();
            Type t = ubsV.GetType();
            PropertyInfo[] pi = t.GetProperties();
            foreach (PropertyInfo prop in pi)
            {
                ls.Columns.Add(prop.Name,100);
            }
            return true;
        }

Die Klasse hat nur einfache variablen deklariert, die ich gerne an das Listview Objekt übergeben möchte.


        private bool listViewFill(UBSPMVorgangHeaderObject ubsData, ref ListView ls)
        {
            ls.Items.Clear();
            foreach (var ubsItem in ubsData.data)

//ubsItem = UBSPMVorgang

            {
                System.Diagnostics.Debugger.Break();

// *** Hier ist mein Problem
                ls.Items.Add(new ListViewItem(ubsItem.ToString()));
// *** Hier ist mein Problem

            }
            System.Diagnostics.Debugger.Break();
            return true;

        }


public class UBSPMVorgang
{
        public string id { get; set; }
        public string dateAdded { get; set; }
        public string createdBy { get; set; }
        public string nn1 { get; set; }
        public string nn2 { get; set; }
}

Wie kriege ich jetzt

ls.Items.Add(new ListViewItem(ubsItem.ToString()));

die Klassendaten in die Listview (Dynamisch, also ohne die einzelnen variablen anzusprechen)

Für eure Hilfe schon vorab thx

16.834 Beiträge seit 2008
vor 5 Jahren

Reflection ist vermutlich die umständlichste aller Möglichkeiten.

Mit ls.Items.Add(new ListViewItem(ubsItem.ToString()));
übergibst Du dem ListView nur ein String des Klassennamens, ohne Inhalte.
Du musst schon die Werte aus der Klasse in das ListViewItem übertragen. Wenn Du nicht weisst wie das funktioniert: ein Blick in die Doku genügt; dort ist nicht nur ein Beispiel...

Aber was ist denn der genaue Wunsch?
Willst Du jede Art von Klasse in einem Grid/ListView darstellen; oder hast Du konkrete Vorstellungen?
Natürlich könnte man das via Generic (Generisch, nicht Reflection) lösen; aber ich finde es ist schneller und einfacher kurz die ListView zusammen zu setzen, als sich mit einer 80% generischen Lösung zu beschäftigen.

PS: Statt System.Diagnostics.Debugger.Break(); -> [Artikel] Debugger: Wie verwende ich den von Visual Studio?

P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren

Hi,

danke für deine Antwort und danke für den Tipp mit dem Debugger.
Ich habe schon eine genaue Vorstellung.
Ich habe halt mehrere Klassen und will nicht für jede Klasse eine eigene Listview erstellen bzw. die Felder Hard codieren.

Du musst schon die Werte aus der Klasse in das ListViewItem übertragen

--> Genau das war meine Frage. Ob es hierzu einen generischen Ansatz gibt.

ein Blick in die Doku genügt; dort ist nicht nur ein Beispiel...

--> Welche Doku?

Hinweis von Abt vor 5 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig?
Keine Full Quotes!

16.834 Beiträge seit 2008
vor 5 Jahren

Ich habe halt mehrere Klassen und will nicht für jede Klasse eine eigene Listview erstellen bzw. die Felder Hard codieren.

Das ist unüblich. I.d.R. definiert man eine ListView im Code.
Man will ja i.d.R. nicht alle Eigenschaft eines Objekts auch wirklich sichtbar haben; oder man möchte eine andere Ausrichtung, Breite der Spalten, Formatierung etc...

Willst Du das tatsächlich alles dynamisch anhand der Properties haben, dann wirst Du doch Reflection benötigen, weil Du ansonsten weder an Typ noch an Name der Eigenschaft kommst.
Das musst Du aber selbst ausprogrammieren; das kann WinForms nicht von Haus aus.

P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren

Ok verstehe.
Dank für die Info.

Wie baue ich mir denn das Item dynamisch jetzt auf? Einen Tipp für mich?

16.834 Beiträge seit 2008
vor 5 Jahren

Als erstes weise ich Dich erneut auf [Hinweis] Wie poste ich richtig? hin: bitte keine Full Quotes!

Wie Du es dynamisch aufbaust?

  • Mit Relfection die Typen und Namen der Eigenschaften ermitteln
  • Anhand der Namen und Typen der Eigenschaften die ListView zusammen stellen
  • Jedes Objekt, das Du hast, in ein ListViewItem übertragen
  • Liste von ListViewItems dem ListView übergeben
P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren

ok 😁

4.939 Beiträge seit 2008
vor 5 Jahren

Muß es denn unbedingt eine ListView sein? Denn mit dem DataGridView und dessen Binding bist du viel flexibler, s.a. Vergleich DatagridView - ListView.

P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren
5.299 Beiträge seit 2008
vor 5 Jahren

Oh - das ist ein ziemlich gutes Control - da brauchste nur der DataSource eine BindingSource zuweisen, und wenn alles richtig konfiguriert ist, ist damit die ListView befüllt.
Gibt doch auch ein umfangreiches DemoProjekt zu dem Control - gibt das denn garnix her für deine Problematik?

Der frühe Apfel fängt den Wurm.

P
POLI Themenstarter:in
7 Beiträge seit 2017
vor 5 Jahren

gibt das denn garnix her für deine Problematik?

Doch, das ist genau was ich brauch. Dachte mir nur, dass es vielleicht auch andere interessieren könnte, die das hier lesen.