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
[erledigt] List<MyClass> an DataGridView binden (per DataSource): DGV bleibt leer
Ravyle
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

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

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ravyle am .
private Nachricht | Beiträge des Benutzers
uNki
myCSharp.de - Member



Dabei seit:
Beiträge: 58

beantworten | zitieren | melden


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)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von uNki am .
private Nachricht | Beiträge des Benutzers
Ravyle
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ravyle am .
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.296

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 58

beantworten | zitieren | melden

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 :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von uNki am .
private Nachricht | Beiträge des Benutzers
Ravyle
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 9.999

beantworten | zitieren | melden

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.

Moderationshinweis von herbivore (07.02.2012 - 20:25)

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.

private Nachricht | Beiträge des Benutzers