Argumente fehlerhaft, Konvertierung scheitert
-
Also das mit dem Event Handler hat geklappt. Ich habe es angefangen eizutippen und er hat den Rest vorgeschlagen. Nun steht dann in meiner listDecks jedoch beim Programmstart alles nicht untereinander dicht an dicht, sondern immer 2 nebeneinander und zwischen den Zeilen auch zweimal ein Zeilenumbruch. Dadurch sehen die Einträge sehr unübersichtlich aus. Wie kann man das ändern?
-
benutzer_1234 schrieb:
Wie kann man das ändern?
Indem du dir überlegst, was passiert ist. Du musst mal darüber nachdenken wie es zu dem Ergebnis kommen konnte (schließlich hat es einen Grund, das es jetzt so aussieht). Und schlussendlich indem du den Debugger benutzt und dir genau anschaust, wann was zur liste hinzugefügt wird
Fragen denen du nachgehen solltest: Hat das Auslesen der Datei geklappt? Wie sieht meine Decktabelle nach dem Auslesen aus? Liegt das Problem beim Hinzufügen zur Liste?
-
OK, also da du weißt, wo der Fehler scheinbar liegt kann ich beruhigt versuchen den selber rauzufinden, da das Problem mal wieder vor dem Bildschirm sitzt
Ich habe das mit dem Breakpoint mal versucht nach Anleitung.
Habe mir die Werte reingezogen: deck.Name, liste, listDecks.Items
Bei liste kam ganricht erst was und ich weiß nicht wieso. listDeck.Items lief einwandfrei nur beim letzten Eintrag meiner Textdatei soll was fehlerhaft gewesen sein. Problem ich kann nicht rekonstruieren. Das debugging funktioniert nun weider nicht mehr, obwohl der Evetnhandler noch vorhanden ist. Ich hatte was wegen einer Fehlermeldung im designer gelöscht und weiß nicht mehr was. Möglicherweise gab es da nochmal einen Eintrag zum Eventhandler.
-
Also das Debugging selber funktioniert natürlich, aber nur bis zum Form1_Load.
Ab da kann ich nicht mehr mit F10 hin und her springen und überprüfen, was passiert in listDecks und so weiter. Es wird auch wieder nicht ausgegeben in listDecks. Der Eventhandler im Konstruktor ist aber unverändert.
-
Wieso machst du immer mit F10 rum? Setz ein Breakpoint in die Load Methode und steppe mit F5 durch.
-
OK, also ich habe F5 gedrückt nach dem Setzen eines Breakpoints auf die Form1_Load (listDecks.Items.Add(deck.Name.ToString());)
Er öffnet dann die Form1 und dann kann ich nciht weiter debuggen. Wenn ich auf das Visual C Codefesnter klicke um weiter zu debuggen, passiert nichts mehr bei F5. Wenn das daran liegt, aber wieso?
Ich müsste nur wissen, ob ich falsch debugge, oder das schon mit dem Grund zu tun hat, wesahlb nichts in list erscheint oder ob irgendwas anderes nicht stimmt, weil er die Liste ja vor 3-4 Stunden noch befüllt wurde ohne Probleme. Vielleicht muss ich ja mal den PC neu starten, hatte schonmal ein ähnliches Probelm
-
Mit F5 startest du das Programm mit dem Debugger angehängt. Dieser läuft solange, bis er zum ersten Breakpoint kommt und stoppt dort. Du solltest beim Breakpoint sein, welcher eine gelbe Markierung nun hat. Sofern natürlich du überhaupt einen Breakpoint gesetzt hast?
Mit F10 gehst du dann Schritt für Schritt weiter. F10 überspringt dabei aber Funktionen usw., während du mit F11 bei jedem Schritt auch in die Funktion selber vordringen kannst.
Mit F5 kannst du sagen, dass der Debugger wieder weiterlaufen soll, bis zum nächsten Breakpoint.War das nun etwas verständlicher?
Und sonst: Beschreib dein Problem genauer. "Passiert nichts mehr" ist mir etwas zu ungenauGrüssli
-
Ich tippe darauf, daß der Form.Load() gar nicht mehr abonniert ist.
Schau mal in die zugehörige form.designer.cs, ob dortthis.Load += new EventHandler(this.Form1_Load);
noch drin steht (bzw. im Eigenschaftfenster beim Load-Ereignis).
Außerdem könntest du den gesamten Code von Form.Load() auch im Konstruktor ausführen (nach InitializeComponent()).
-
@Dravere: Ahhh, dann macht es ja auch Sinn mehrere Breakpoints zu setzen. Kommt davon, wenn man sich nur ums programmieren kümmert, aber nicht um die Umgebung
Weshalb ich geschrieben habe, dass ernichts gemacht hat, hätte wirklich mal genauer sein können. Sorry für die mangelnde Ausführung. Mein Programm kommt bei F5 garnicht erst zum Breakpoint, der wird nicht auf Geld gesetzt.Womit wir also dazu kommen, dass der EventHandler nicht mehr stimmt, weshalb auch immer, wo ich dann zu Th69 komme:
Der Eintrag fehlt im Designer tatsächlich. War aber vorher da?! Wenn ich die Zeile nun so eingebe, dann wird allerdings der Eventhandler angegangen, das ein using Verweis fehlt. Blöd nur, dass der Eventhandler im namespace Hauptprogramm ist, den die Form1 ja auch hat, also jetzt verstehe ich ganrichts mehr
-
Habe jetzt kurzen Prozess gemacht. Eventhandler komplett raus und über den Blitz bei Eigenschaften einfach einen neuen genriert. Jetzt läuft das debugging auch wieder weiter.
Wenn ich ale durchgehe, dann macht er alles erstmal wie gewollt. Beim Listen füllen erhöht er dann die Zahl der Counts, was ja auch sein soll. Allerdings ist bei öffnen der Form1 dann deck.Name null, weshalb er auch nichts ausgeben kann.
Liegt der Fehler darin, wie ich die Liste zurückgebe?
-
benutzer_1234 schrieb:
Habe jetzt kurzen Prozess gemacht. Eventhandler komplett raus und über den Blitz bei Eigenschaften einfach einen neuen genriert. Jetzt läuft das debugging auch wieder weiter.
Hätte ich nicht anders gemacht
benutzer_1234 schrieb:
Liegt der Fehler darin, wie ich die Liste zurückgebe?
Sieht nicht so aus. Ausser der Code den du hier zeigst, stimmt nicht überrein mit deinem Code
Verkleinere mal das Deck auf ein paar Einträge und geh einfach mal mit dem Debugger durch, was er denn genau lädt. Du solltest unten beim Debuggen weitere Fenster haben (Autos, Locals). Sonst kannst du die Fenster holen über das Menü Debug -> Windows. Sobald der Debugger irgendwo hält, siehst du dort die Variablen und kannst sie auch aufklappen, um die inneren Werte zu sehen. Dies geht auch, wenn du mit der Maus über der Variable im Code schwebst.Also den Breakpoint am Anfang setzen und dann auch in die
LoadFromFile
reinsteppen mit F11 und die Methode durchgehen. Dann siehst du auch, ob alles korrekt geladen und abgelegt wird. Wenn du mit F10 durch die Methode stepst und ans Ende kommst, geht er automatisch wieder raus in dieLoad
Methode. BeiGetDecks
wieder F11 drücken, damit du reinkommst und wieder F10 bis du rauskommst.Über die Locals kannst du jeweils prüfen, welche Werte denn in der Liste sind.
Noch so ein paar Dinge am Rande:
Du hast erneut alle Variablen öffentlich gemacht. Komm davon weg! Mach alles privat was privat sein kann und nur das öffentlich, was wirklich öffentlich sein muss. Verwende Getter und Setter. Das erleichtert dir auch das Debuggen, damit nicht jeder von überallher auf die Variablen zugreifen kann und du damit bessere Kontrolle hast.
Wieso verwendest du als Wert des Decksdecimal
?decimal
sollte man nur für Spezialfällen benutzen, da es eine 128 Bit 10er Potenz Gleitkommazahl ist. Für Dezimalzahlen reichtfloat
oderdouble
meistens aus. Wenn man mit Ganzzahlen arbeitet, sollte man auch Ganzzahlen verwenden, z.B.int
.Grüssli
-
Ok, habe mir das Ausgabefenster geholt und das Debuggen gestartet.Ist es normal, dass dabei unzählige Zeilen rauskommen, bei denen in etwa das folgende steht:
Einzelschritt: Nichtbenutzercode "System.Windows.Forms.Application.SetCompatibleTextRenderingDefault" wird übersprungen.
-
Was ich schonmal sagen kann, das Programm befühlt die Werte (deck.Name) ordnungsgemäß. Auslesen der Datei funktioniert also. Die while-Schleife:
while ((line = rd.ReadLine()) != null) { string[] words = line.Split('|'); Deck deck = new Deck(); deck.Colors = words[0]; deck.Name = words[1]; deck.Categorie = words[2]; deck.Text = words[3]; deck.DeckValue = decimal.Parse(words[4]); liste.Add(deck); }
wird bis zum letzten Eintrag durchgeführt. Dann springt er in die Kopfzeile und möchte von vorn anfangen. Beim F11 auf deck.Colors stellt er fest, es gitb nun keinen Eintrag mehr und beendet die Schleife und öffnet sofort das Formload.
Danach springt er aber nicht in Hauptprogramm zurück, um:
List<Deck> Decks = decktab.GetDecks(); foreach (Deck deck in Decks) { listDecks.Items.Add(deck.ToString()); }
auszuführen.
-
Hast du eine leere Zeile im File? Z.b. am Ende? Dann führt das
line.Split('|')
zu einem Array mit der Länge 0 und wenn du aufwords[0]
zugreifst, wird eineIndexOutOfRangeException
geworfen.Er stellt daher nicht fest, dass es keine Einträge mehr gibt bei
words[0]
und beendet nicht einfach die Schleife, sondern er wirft dann eineIndexOutOfRangeException
. Und das sollte jedem sofort auffallen ...benutzer_1234 schrieb:
Ok, habe mir das Ausgabefenster geholt und das Debuggen gestartet.Ist es normal, dass dabei unzählige Zeilen rauskommen, bei denen in etwa das folgende steht:
Einzelschritt: Nichtbenutzercode "System.Windows.Forms.Application.SetCompatibleTextRenderingDefault" wird übersprungen.
Ja, das ist normal. Wenn du irgendwo reinspringen wolltest, was nicht zu deinem Code gehört. Wenn also dein Debugger z.B. bei
Application.SetCompatibleTextRenderingDefault(false)
war und du auf F11 gedrückt hastGrüssli
-
Tatsächlich. Am Ende der Einträge war eine Leerzeile. Der Debugger hatte auch " " angeziegt, aber das habe ich nicht so interpretiert, als das es eine Leerzeile ist
-
Nun kann ich endlich wieder ganz normal debuggen und zum Problem kommen, weshalb die Lsite nicht untereinander ausgegebn wird. Mir wurde gesagt debugge mal und schaue, was du erkennst. Wird richtig geladen, übergeben und so weiter.
Die decktab aus dem Hauptprogramm bekommt tatsächlich alle Werte und hat vier Einträge mit jeweils entsprechenden Namen, Farben und so weiter. Ich kann ehrlich gesagt nicht sehen, wo der Fehler ist, weil da ja nicht steht, wie die gespeichert werden.
-
Ehm, bei welchem Fehler sind wir nun? Ich habe gerade ein wenig den Überblick verloren
Grüssli
-
Sorry, kann ich verstehen.
Also ich habe ja die Liste listDecks, auf der die deck.Name alle ausgegeben werden sollten. Dies erfolgt aber nicht der Reihe nach unten:Name 1 Name 2 Name 3
sondern in 2er Schritten hintereinander mit merkwürdigem Zeilen umbruch, sieht so aus:
Name 1 Name 2 Name 3 Name 4
-
Ehm, ich muss hier mal raten ...
Du verwendest eineListView
? Und du hast in den Eigenschaften nicht die richtigeView
ausgewählt?Grüssli
-
Vielen Dank, du hast richtig geraten