Argumente fehlerhaft, Konvertierung scheitert
-
Ich habe ein Programm entworfen zum Verwalten eines Kartenspiels.
Dabei sollen Daten aus einer Textdatei ausgelesen werden und in die listDecks übergeben werden. Dort möchte ich dann den markierten Datensatz beim Markieren in die nächste listCards überführen, was ich allerdings selber versuchen möchte. Ich habe nur bei auslesen der Daten und übergeben in die listDecks eine Fehlermeldung, die mir nicht schlüssig ist (unten im Quellcode markiert).
Ich wäre echt froh, wenn jemand weiß, wo mein Denkfehler ist.using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Daten { public class Deck { public string Colors; public string Name; public string Kategorie; public string Text; public decimal DeckValue; } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Daten { public class Decktabelle { public List<Deck> liste = new List<Deck>(); public string DateiName; public Decktabelle(string UDatei) { DateiName = UDatei; } public void LoadFromFile() { StreamReader rd = new StreamReader(DateiName); string line; while ((line = rd.ReadLine()) != null) { string[] words = line.Split('|'); Deck deck = new Deck(); deck.Colors = words[0]; deck.Name = words[1]; deck.Kategorie = words[2]; deck.Text = words[3]; deck.DeckValue = decimal.Parse(words[4]); liste.Add(deck); } rd.Close(); } public List <Deck> GetDecks() { return liste; } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Daten; namespace Hauptprogramm { public partial class Form1 : Form { protected Decktabelle decktab; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { decktab = new Decktabelle("j:\\Deck.txt"); decktab.LoadFromFile(); List<Deck> Decks = decktab.GetDecks(); foreach (Deck deck in Decks) { listDecks.Items.Add(deck); //Hier wird die Zeile komplett markeirt mit der Fehlermeldung //Argument kann nicht von Daten.Deck in String konvertiert //werden } } private void listDecks_SelectedIndexChanged(object sender, EventArgs e) { Deck deck = (Deck)listDecks.SelectedItem; } } }
-
Na ja, die Instanz listDecks (ComboBox? Liste? Ah, eig. egal) verwaltet in ihrer Items-Collection eben string-Werte.. und du versuchst über die Add-Methode eine Instanz der Klasse "Deck" hinzuzufügen.
So löst man das Problem: In der "Deck"-Klasse überschreibt man die ToString()-Methode (im einfachsten Fall gibst du da einfach den Namen zurück.. oder was auch immer du willst) und ruft diese dann beim Hinzufügen eines Decks auf:listDecks.Items.Add(deck.ToString());
-
Oh, das ist ja recht Simpel;)
Jetzt habe ich die Textdatei in der drin steht: Color|Name|...
Ich will nur den Namen in der listDecks haben, aber die gibt nichts aus?
-
benutzer_1234 schrieb:
Ich will nur den Namen in der listDecks haben, aber die gibt nichts aus?
Tja, klingt danach, als ob du deinen Code mal debuggen solltest. Setz einfach einen Breakpoint bei der Schleife, die die Liste füllen soll und schau's dir an.
-
Ok, also ich habe in Zeile 28 den Breakpoint gesetzt. Gehe nun mit F10 durch. Er beginnt in folgendem Code (Haupteinstiegspunkt bis zum Ende):
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using Hauptprogramm; namespace Magic_Deck_Viewer { static class Program { /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
In der letzten Zeile öffnet er die Form1. Wie mache ich dann weiter? Wenn ich die Form beende wird das Debugging beendet, wenn ich in den Code drücke und F10 drücke, passiert nichts mehr.
-
Musst du Form1_Load eventuell noch Abonnieren? (this.Load += new EventHandler(this.Form1_Load);)
PS.
Du hast Hauptsächlich Deutsche Bezeichner außer "Colors" und "DeckValue" (Und dein Haupt Namespace). Versuch konsistent zu bleiben. Entweder alle Deutsch ("Farben", "DeckWert") oder alle Englisch.
-
Da ich das noch nicht getan habe ist das wohl da sProblem;)
Das muss ich in diesem Entwurf (oder wie das heißt, weiß das leider nicht so genau) oder so ändern oder? Wie komme ich da denn hin. Gibts da eine bestimmte Taste.Wegen den Bezeichnungen muss ich sagen, das ich nicht hauptsächlich deutsche habe, da TEXT und NAME international sind;) Kategorie kam nachträglich und da habe ich mich vertippt, habe das natürlich jetzt aber geändert, danke für den Hinweis.
-
benutzer_1234 schrieb:
Da ich das noch nicht getan habe ist das wohl da sProblem;)
Das muss ich in diesem Entwurf (oder wie das heißt, weiß das leider nicht so genau) oder so ändern oder? Wie komme ich da denn hin. Gibts da eine bestimmte Taste.Du müsstest im Konstruktor
this.Load +=
tippen können, VS schlägt dann Text vor welches du mit Tab erstellen lassen kannst.
Ansonsten schau mal in dem Properties Editor vom Designer, wenn ich mich recht erinnere gibts da ein bereich mit einem 'Blitz' Symbol, das wählst du aus, und da kannst du dann die Eventhandler automatisch erstellen lassen.
-
David W schrieb:
Musst du Form1_Load eventuell noch Abonnieren? (this.Load += new EventHandler(this.Form1_Load);)
Ich würde eher sagen, dass er die falsche Taste gedrückt hat. Mit F10 startet man am Anfang des Programmes, mit F5 startet das Programm im Debugmodus und geht bis zum ersten Breakpoint
@benutzer_1234,
Am Anfang F5 drücken, nicht F10!Grüssli
-
Letzteres habe ich gemacht, aber da öffnet er die Form sofort und danach passiert nichts mehr. ALso das mit dem Event müsste eigentlich schon stimmen. Da Event ist dann dafür, für den Fall, dass Form1 geladen wird oder?
-
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?