MessageBox wird nicht angezeigt
-
Hallo,
ich will in meinem Programm ein XML-File einlesen. Je nachdem welchen Wert ich in bestimmten Tags erwarte, führe ich unterschiedliche Methoden aus, die in einer abstrakten Klasse implementiert sind. Wenn nun ein "falscher" Wert in einem XML-Tag steht, soll eine MessageBox mit einem passenden Hinweis ausgegeben werden. Da dieser sehr speziell sein soll, gibt es für jeden Fehler eine eigene MessageBox.
Das Problem ist nun folgendes:
Wenn mehrere Fehler durch verschiedene Funktionen angezeigt werden sollen, wird nur die 1. MessageBox dargestellt. Alle nachfolgenden werden einfach ignoriert. Kommen vom gleichen Typ mehrere Fehler, gehen die Boxen schön nacheinander auf.
Wie kann ich es schaffen, dass immer alle MessageBoxen angezeigt werden?Vielleicht noch was zur Architektur:
Ich habe eine abstrakte Klasse, die die Fehlermeldungen und Funktionen zum Einlesen der Werte bereitstellt. Die erbende Klasse liest dann das XML-File ein und führt je nach Tag die Funktion der abstrakten Klasse aus.
Wenn ich die Funktion nicht in der abstrakten Klasse sondern in der erbenden Klasse habe funktioniert es einwandfrei. Dann bräuchte ich aber sehr viel redundanten Code und das will ich auf keinen Fall.Es wäre super, wenn mir jemand helfen könnte!
Grüße
MeinAccountPS: Ich verwende das Windows Forms Framework.
-
Meine Reaktion zu deinem Beitrag: Hääää?!?!???
Oder anders gesagt: Ich habe nicht die leiseste Ahnung, was du eigentlich machst!
Kannst du dies vielleicht nochmals etwas verständlicher erklären? Und womöglich etwas Code dazugeben, damit man deinen Formulierungen folgen kann? Dein Vorgehen klingt äusserst seltsam.
Grüssli
-
Okay, das habe ich befürchtet
Was ich mache:
Mein Programm muss ein XML-File einlesen. Dieses File enthält Werte, die ich in Variablen speichern will. So sieht das z.B. aus<minZellspannung>2000.0</minZellspannung>
Um das einzulesen habe ich dann verschiede Funktionen um einen int oder einen double einzulesen
protected void readFromXML(String attributName, String parentElement, out double value) { //Diese Methode sucht das in attributName übergebene Element im XML-File und schreibt den zugehörigen double Wert in die übergebene Variable value double tmpDouble = 0.0; String tmpString = ""; if (xmlReader.ReadToFollowing(attributName)) { xmlReader.Read(); tmpString = xmlReader.Value.Replace('.', ','); if (!double.TryParse(tmpString, out tmpDouble)) readFromXMLFehler(attributName, parentElement, tmpDouble); //Hier wird dann die entsprechende Fehlermeldung angezeigt } value = tmpDouble; } protected void readFromXML(String attributName, String parentElement, out int value) { //Diese Methode sucht das in attributName übergebene Element im XML-File und schreibt den zugehörigen int Wert in die übergebene Variable value int tmpInt = 0; String tmpString = ""; if (xmlReader.ReadToFollowing(attributName)) { xmlReader.Read(); tmpString = xmlReader.Value.Replace("h", ""); //Damit bei einer ID das "h" am Ende gelöscht wird if (int.TryParse(xmlReader.Value, out tmpInt)) { //normalen Int einlesen //hier muss nichts gemacht werden. Die Operation wird schon in der Bedingung ausgeführt } else if (!int.TryParse(tmpString, System.Globalization.NumberStyles.AllowHexSpecifier, new System.Globalization.CultureInfo("de-DE"), out tmpInt)) //Hexwert einlesen readFromXMLFehler(attributName, parentElement, tmpInt); //Hier wird dann die entsprechende Fehlermeldung angezeigt } value = tmpInt; }
Aufgerufen wird die Funktion dann so:
readFromXML("minZellspannung", parentElement, out limits.rot.minZellspannung);
Die Funktionen readFromXML(...) sind in einer abstrakten Klasse implementiert von der ich ableite. Die abgeleitete Klasse ruft diese Funktionen auf um Werte aus dem XML in Variablen zu speichern.
Da die Fehlermeldungen, die in readFromXMLFehler(...) ausgegeben werden, sehr spezifisch sind, muss jede abgeleitete Klasse diese Meldung selbst definieren. Wie genau die Fehlermeldung aussieht ist ja egal. Hier wird auf jeden Fall eine MessageBox angezeigt.
Wenn jetzt z.B. ein double Wert eingelesen werden soll und aber die Zahl "76.-9" heißt, weil sich jemand vertippt hat, möchte ich eine Meldung ausgeben. Gleiches eben beim Einlesen eines int.
Mein Problem:
Wenn ich jetzt mehrere Integer-Fehler habe werden mir alle MessageBoxen nacheinander angezeigt. Habe ich mehrere Double-Fehler, werden mir auch diese alle angezeigt. Habe ich aber einen Integer- und danach einen Double-Fehler, wird nur die MessageBox vom Integer-Fehler angezeigt. Und genau das ist das Problem.Dieses Problem besteht nicht, wenn die Implementierung der Funktion readFromXML(...) in der abgeleiteten Klasse steckt. Ich möchte den Code aber nicht in jede abgeleitete Klasse packen, deshalb muss es in der abstrakten Klasse bleiben.
Ich hoffe sehr, dass es jetzt verständlicher ist
Gruß
MeinAccount
-
MeinAccount schrieb:
Okay, das habe ich befürchtet
Na immerhin denkst du nicht, ich sei nur zu dumm, um dir zu folgen
MeinAccount schrieb:
Ich hoffe sehr, dass es jetzt verständlicher ist
Also weisst du ...
Ich weiss jetzt was du in etwa machst. Nur sehe ich kaum einen Zusammenhang mit der Fehlerquelle. Wie du zum Beispiel die MessageBox anzeigst, kommt nicht hervor und da liegt doch das Problem?
Du schreibst davon, wenn du eine Methode an einer anderen Stelle definierst, tritt das Problem nicht auf, aber zeigst nicht auf, was sich dabei verändern würde.Du lieferst eine Menge an Informationen, welche ziemlich unnötig erscheinen und einem sogar vom Thema ablenken. Vor allem wenn man solche Codeauschnitte liest:
tmpString = xmlReader.Value.Replace('.', ',');
Schon mal was von
CultureInfo
gehört?Deine Fehlerbeschreibung lässt sehr zu wünschen übrig und wir können eigentlich mit den bisherigen Information lediglich raten. Probier das Problem in einem kleinen Beispiel/Projekt zu reproduzieren. Falls du es bis dann noch nicht selber gefunden hast, könntest du damit auf die Leute hier zugehen, welche dann auch eine vernünftige Grundlage zur Analyse haben.
Wenn ich einfach mal etwas raten dürfte:
Du kennst die Bedeutung vonXmlReader.ReadToFollowing
nicht? DerXmlReader
liest nur vorwärts und nicht rückwärts. Wenn du somit am Element vorbei bist, kannst du dieses nicht mehr auslesen, wodurch deineif
-Bedingungen immerfalse
sind und du gar nie die entsprechenden Werte einliest, wodurch es auch nie zu einem Fehler kommt.Grüssli
-
Dravere schrieb:
Wenn ich einfach mal etwas raten dürfte:
Du kennst die Bedeutung vonXmlReader.ReadToFollowing
nicht? DerXmlReader
liest nur vorwärts und nicht rückwärts. Wenn du somit am Element vorbei bist, kannst du dieses nicht mehr auslesen, wodurch deineif
-Bedingungen immerfalse
sind und du gar nie die entsprechenden Werte einliest, wodurch es auch nie zu einem Fehler kommt.Leider falsch geraten. Die Verwendung passt an dieser Stelle so
Habe allerdings deinen Tipp mit dem kleinen Beispielprojekt nachverfolgt und ziemlich dumm aus der Wäsche geschaut als sich der Fehler nicht reproduzieren lies. Daraufhin habe ich meinen Code noch mal sorgfältig unter die Lupe genommen und musste leider feststellen, dass mein Code einwandfrei funktioniert und ich nur einen großen Logikfehler drin hatte...
Mein Problem hat sich also geklärt.Vielen Dank für deine Hilfe und Entschuldigung für das Verknotes des Hirns durch seltsame Beschreibungen
Da dieses Thema ohne Mehrwert für irgend jemand ist, kann es gelöscht werden.
Grüße
MeinAccount