Laden...

[erledigt] List<MyClass> an DataGridView binden (per DataSource): DGV bleibt leer

Erstellt von Ravyle vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.074 Views
Thema geschlossen
R
Ravyle Themenstarter:in
18 Beiträge seit 2011
vor 12 Jahren
[erledigt] List<MyClass> an DataGridView binden (per DataSource): DGV bleibt leer

Guten Morgen, erstmal.

Mittlerweile bekomme echt eine Kriese mit dem DataGridView...

Ich habe eine Liste(T) mit ~130 Werte, die eingetragen werden müssen.

Diese werden durch das Einlesen einer Datei gefüllt, soweit funktioniert alles Prima.

Nun kommt aber das Problem mit dem DataGridView, das diese Liste anzeigen soll:
Nach etlichen Probieren und Googeln habe ich es einfach aufgegeben, und wende mich nun mal wieder an euch:

Ich habe folgenden Code:


        public List<skillresy> sk = new List<skillresy>();

        private void openSkillRes()
        {
            
            try
            {
                FileStream av = File.Open(openskillress.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                BinaryReader br = new BinaryReader(av, Encoding.ASCII);
                br.ReadChars(128);
                int _count = br.ReadInt32();
                while (br.PeekChar() != -1)
                {
                    skillresy _v = new skillresy();
                    _v.ReadFile(br);
                    sk.Add(_v);
                }
                MessageBox.Show(sk.Count.ToString()); // ist am Ende dieselbe Zahl wie _count
                dataGridView1.DataSource = null;
                //dataGridView1.AutoGenerateColumns = true;
                dataGridView1.DataSource = sk;
                br.Close();
                av.Close();
            }
            catch
            {
                MessageBox.Show("Error while loading this file!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Dazu habe ich auch ein Leeres DataGridView, sprich ohne Columns oder sonstiges, da es diese Automatisch erstellen soll.

Wenn ich nun die Datei öffne, wird alles ausgeführt, ich bekomme keinen Fehler angezeigt, das DataGridView bleibt aber trotz allem leer.

Ich habe es bereits mit einer BindingList anstatt List probiert, außerdem habe ich dazwischen noch eine BindingSource probiert.

Wo ist der Fehler?

Grüße,

Ravyle.

U
58 Beiträge seit 2011
vor 12 Jahren

skillresy _v = new skillresy();
_v.ReadFile(br);
sk.Add(_v);

sofern deine ReadFile() methode auch wirklich daten in dein _v objekt schreibt (damit meine ich, auch wirklich im _v objekt irgendwelche properties mit daten füllt), sollten die auch in deinem datagrid angezeigt werden.

du würdest ja - sofern du keine properties eingrenzt, bei der zuweisung der datasource - je property deiner klasse skillresy eine spalte erhalten.

hast du mal probiert, deine liste sk zu durchlaufen und die objekte mal auszulesen? evtl. sind sie ja tatsächlich leer, weil seine methode ReadFile() nicht funktioniert.



foreach (skillresy item in sk)
{
Console.WriteLine(item.DEINE_PROPERTY.ToString());
}

wenn da was rauskommt, kannst du ja noch einmal bescheid sagen

EDIT:
(kannst natürlich auch nen brakepoint setzen und die liste im debugger anschauen)

R
Ravyle Themenstarter:in
18 Beiträge seit 2011
vor 12 Jahren

Heyho,

Danke erstmal für die Antwort.

Ich habe es eben mal etwas anders getestet, und zwar so:


                foreach(skillresy it in sk)
                skillres.Rows.Add(it.id.ToString(), it.icon_file_name);

Diese Werte sind nicht leer und immer "verschieben", sprich, genau die, die ich haben möchte.

Die Liste ist somit gefüllt.

Ich verstehe nur nicht, warum diese nicht per DataSource im Grid angezeigt werden...

R
Ravyle Themenstarter:in
18 Beiträge seit 2011
vor 12 Jahren

Ok, kleine Info nachdem ich ein bisschen getestet habe:

  • DataGridView erstellt die Columns nicht automatisch, trotz dataGridView1.AutoGenerateColumns = true;

So nebenbei: Meine Liste ist in etwa so aufgebaut:

class skillresy
{
public Int32 id = 0;
public String icon_file_name = null;
// Und noch so 120 Einträge weiter....
}

Liegt das vielleicht daran, das ich nicht mit diesem get-set Zeugs gearbeietet habe?

  • Nachdem ich eine test-Column hinzugefügt hatte, erstellt er mir zumindest list.count Zeilen, die dann aber überhaupt keinen Wert haben (nicht einmal die erste Value der Liste).
2.298 Beiträge seit 2010
vor 12 Jahren

Das get - set Zeuchs gehört zu Properties. - Allgemein sollten auch Datenklassen direkt mit Properties arbeiten.

DataBinding geht wie du jetzt auch festgestellt hast nur auf Properties der Klasse die man bindet, nicht auf public Felder.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

U
58 Beiträge seit 2011
vor 12 Jahren

okay... ich bin davon ausgegangen, dass deine klasse 'skillresy' über properties verfügt 😃

EDIT:

deine klasse sollte auf jeden fall mit properties arbeiten...

statt also nur

public Int32 id = 0;

zu schreiben, benutze mindestens:

public int ID { get; set; }

oder "volle" properties:


private int _id;
    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

(Int32 = int) ... die properties musst du nicht per hand schreiben

"prop" oder "propf" (für volle) tippen und TAB drücken genügt.

jetzt kannst du objekte deiner klasse auch an steuerelemente binden.

du solltest dich aber auf jeden fall über properties belesen. die sind wichtig 😃

R
Ravyle Themenstarter:in
18 Beiträge seit 2011
vor 12 Jahren

Na super, das sagt man mir erst jetzt? 😁

Ich habe größtenteils immer versucht, Properties zu vermeiden, und habe mich damit nie beschäftigt, aus dem einfachen Grund, weil ich meist zu Faul war, das ganze get { hier = da } [...] zu schreiben, aber mit { get; set; }... Geht ja noch viel einfacher.

Danke euch, funktioniert nun einwandfrei! 😉

F
10.010 Beiträge seit 2004
vor 12 Jahren

Du hast also vergessen die Grundlagen zu erlesen, machst alles genau so wie man es nicht machen soll und machst dann andere dafür verantwortlich?

Faulheit ist kein guter Grund richtige Herangehensweisen nicht zu benutzen.

Hinweis von herbivore vor 12 Jahren

Man könnte das sicher freundlicher ausdrücken. In der Sache ist der Einwand jedoch berechtigt. Es ist wichtig, sich vorab darüber informieren, was Properties sind, warum es sie gibt und wo man sie nutzen sollte. Genauso sollte bekannt sein, dass man öffentliche Felder üblicherweise nicht verwenden sollte. Das alles fällt unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und hätte dir und uns unnötigen Aufwand erspart.

Thema geschlossen