WinFuture-Forum.de: C# probleme mit DatagridView - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

C# probleme mit DatagridView DataGridView reagiert anders als erwartet.


#1 Mitglied ist offline   Tomarr 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 02. Januar 08
  • Reputation: 0

geschrieben 17. Dezember 2014 - 19:47

Hallo zusammen.

Ich hab da mal ein Problem mit dme DataGridview. Und zwar ist es folgendes. Ich programmiere gerade an einem Vokabeltrainer. Um jetzt Vokabeln möglichst einfach eingeben zu können benutze ich eine Form mit einem DataGridView und zwei Spalten (Deutsch und Englisch). Soweit so OK.

Ist nun die Eingabe der Liste von Vokabeln beendet möchte ich auf einen Button drücken der erstmal die ganzen Vokabeln in List<Vokabel> überträgt. Das mache ich weil ich die Classe Vokabel serialisiert habe um diese in meinem eigenen Format abspeichern zu können.

Allerdings reagiert DataGridView absolut unverständlich in meinen Augen.

Folgender Code funktioniert bisher wenigstens einigermaßen, führt aber trotzdem zu abstürzen.
        private Vokabel vok = new Vokabel();
        private List<Vokabel> Vokabeln = new List<Vokabel>();



            for (int i = 0; i < data_Eingabe.Rows.Count;i++ )
            {
                vok.s_Deutsch = data_Eingabe.Rows[i].Cells["col_Deutsch"].Value.ToString();
                vok.s_English = data_Eingabe.Rows[i].Cells["col_English"].Value.ToString();
                vok.i_Phase = 1;
                Vokabeln.Add(vok);
            }



Die GridView hat wie gesagt zwei Spalten, links Deutsch, rechts Englisch.
Wenn ich jetzt nichts eingebe und Speicher bekomme ich eine System.NullReferenceException in deer Zeile vok.s_Deutsch = data_Eingabe.Rows[i].Cells["col_Deutsch"].Value.ToString();
Gebe ich eine Vokabel ein (Z.B. Du und You) bekomme ich ebenfalls eine System.NullReferenceException, allerdings in der Zeile vok.s_English = data_Eingabe.Rows[i].Cells["col_English"].Value.ToString();... was ich etwas merkwürdig finde weil es ist ja ein Wert vorhanden und der Index sollte auch stimmen.
Gebe ich drei Vokabeln ein (Du, you und in der nächsten Zeile Ich) speichert er die erste Zeile komplett und verursacht wieder eine System.NullReferenceException für die nächste Zeile erste Zelle.

Ich vermute mal das es daran liegen könnte das bereits eine leere Zeile vorgegeben wird sobald man etwas eingibt und dass die Zelle als leer gilt solange man den Cursor noch in dieser hat. Allerdings finde ich dieses Verhalten ein wenig unkompfortabel und seltsam fehlerträchtig.

Gibt es da vielleicht eine bessere Möglichkeit die DataGridView in List zu schieben? Habe mit DataGridView ehrlich gesagt noch nicht viel Erfahrung. Habs halt noch nie gebraucht.
0

Anzeige



#2 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 17. Dezember 2014 - 22:01

Du kannst deine Liste direkt an das Datagrid anbinden.

var Vokabeln = new List<Vokabel>();
data_eingabe.DataSource = Vokabeln;


Wenn du nun etwas in dem Datagrid änderst, änderst du gleich die Werte im Objekt in der Liste und musst diese nicht erst durchschleifen und diese zurückzuspielen.
0

#3 Mitglied ist offline   Tomarr 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 02. Januar 08
  • Reputation: 0

geschrieben 18. Dezember 2014 - 07:22

Das Problem ist halt das ich in Vokabel drei Spalten zu belegen habe, nämlich noch den Integerwert i_Phase. Der soll beim Speichern immer 1 sein und wird erst später gebraucht.

Na gut, das könnte ich vielleicht noch mit einer versteckten Spalte hin bekommen. Aber ich sehe in deinem Beispiel gar keine sichere zuordnung der Spalten, also dass die deutsche Vokabel auch unter s_Deutsch gespeichert wird.
0

#4 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 18. Dezember 2014 - 19:02

Du kannst Spalten mit dem Browsable Attribut im Datagrid verstecken.

Verstehe aber dein Problem nicht ganz, die Spalten sind die gleichen wie in deinem Objekt.
Wie werden die Spalten falsch zugeordnet?
0

#5 Mitglied ist offline   Tomarr 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 02. Januar 08
  • Reputation: 0

geschrieben 19. Dezember 2014 - 07:48

Normalerweise gehe ich immer auf nummer sicher das die deutsche Vokabel auch in Deutsch landet und die englische in Englisch, und nicht durch einen dummen Zufall, Programmänderungen, oder auch Fehler mal umgekehrt.
0

#6 _nobido_

  • Gruppe: Gäste

geschrieben 26. Dezember 2014 - 20:43

Der Code scheint mir auf den ersten Blick, soweit dargestellt, sauber.

            for (int i = 0; i < data_Eingabe.Rows.Count;i++ )
            {
                vok.s_Deutsch = data_Eingabe.Rows[i].Cells["col_Deutsch"].Value.ToString();

                vok.s_English = data_Eingabe.Rows[i].Cells["col_English"].Value.ToString();

                vok.i_Phase = 1;
                Vokabeln.Add(vok);
            }




Wenn Du im DGV Daten eingibst, wird automatisch eine neue Zeile erzeugt.
Wenn da allerdings nichts drinnen steht, dann kann da auch kein Value.ToString() funktionieren.
So auf die Schnelle geguckt scheint es mir so, als ob die Daten im DGV den standard-Wert NULL haben - also: nichts.
Und wo nichts ist, da kann auch nichts...
Kannst aber auch die Schleife debuggen und die einzelnen Werte im jeweiligen Durchlauf überprüfen.


        class Vokabel
        {
            public string _d { get; set; }
            public string _e { get; set; }
            int _phase;

            public Vokabel(int p = 1)
            {
                this._phase = p;
            }
        }



Sollte dann auch das Phase-Problem erschlagen.



@Thread-Starter: PM hat sich damit erledigt. :)

happy Rest-Weihnachtstage noch.

Dieser Beitrag wurde von nobido bearbeitet: 26. Dezember 2014 - 23:57

0

#7 Mitglied ist offline   Tomarr 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 02. Januar 08
  • Reputation: 0

geschrieben 13. Januar 2015 - 11:44

Ich danke dir, werde ich mal probieren.
0

#8 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 14. Januar 2015 - 16:42

Wollte ich auch anmerken.....

In der FOR-Schleife lässt du beide DataGrids zeilenweise durchlaufen. Wenn eben in einer Zeile eines DataGrids nichts steht, dann wirft es eine NullReference-Exception für alle DataGrids.

Ich würde hier wohl eher jedes DataGrid als einzeln behandeln und etwaige NullReference-Exceptions abfangen.

Dieser Beitrag wurde von Decay bearbeitet: 14. Januar 2015 - 16:44

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0