henek Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 ich hab da noch ein problem :confused: ich möchte, dass das Programm bei eingabe einer Zahl in die textbox (namens:nameBox), einen Fehler anzeigt mein code für diesen abschnitt try { name = Convert.ToString(nameBox.Text); //Es wird ein Text in nameBox eingegeben// email = Convert.ToString(emailBox.Text); //""// sw = new StreamWriter(@"C:\Dokumente und Einstellungen\c.henek\Desktop\Neuer Ordner\out.txt"); sw.WriteLine("" + nameBox.Text + ""); //Übergabe der Werte an die Textdatei// sw.WriteLine("" + emailBox.Text + ""); sw.Close(); } catch() { MessageBox.Show("Fehler", "", MessageBoxButtons.OK); } brauche schnell eine Antwort....schonmal vorab vielen dank :beagolisc :nett: Zitieren
Pointerman Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 (bearbeitet) Moin! Brauchst Du denn unbedingt eine Exception? Ich haette eher mit Int.TryParse() geprueft, ob es sich um eine Zahl handelt und dann die Meldung ausgegeben. So in etwa: if(Int.TryParse(nameBox.Text)) { MessageBox.Show("Fehler(Bitte sinnvollen Text einfuegen)", "", MessageBoxButtons.OK); } else { //...wie auch immer es weitergeht } [/PHP] Bearbeitet 13. Oktober 2011 von Pointerman Falsche Methode aufgerufen Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Hallo ich weiß nicht ob es das in C# gibt, denke aber schon. In VB.NET kann man das auch wie folgt abfangen If Not IsNumeric(nameBox.Text) THEN 'FEHLER End If Gruß Hans-Jörg Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Hi, nutzte das Textbox Text ChangeEvent und die ASCII Tabelle. Das sieht dann wie folgt aus: private void textBox1_TextChanged(object sender, EventArgs e) { string result = string.Empty; foreach (char item in textBox1.Text) { if ((int)item > 47 && (int)item < 58) { MessageBox.Show("Keine Zahlen bitte"); } else { result += item; } } textBox1.Text = result; } lg Gateway PS: @HJST1979: IsNumeric ist eine eigenart von vb genauso wie IsNothing. Das existiert nicht in c#. Zitieren
henek Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 wenn ich den code von oben anhänge, dann krieg ich den fehler: "Der name "Int" ist im aktuellen Kontext nicht vorhanden" fehler ist in der zeile mit dem if(Int.TryParse.........) was hab ich falsch gemacht? :-( das kann doch net so schwer sein in c# Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Hallo Gateway_man, hab grad den "minicode" durch den Converter gelassen dabei kam heraus if (!Information.IsNumeric(nameBox.Text)) { //FEHLER } Dein Code funktioniert natürlich auch, ich denke aber du hast die Zeichen "," "." "+" "-" vergessen . Desweiteren sollte dies natürlich auch beim verlassen des Steuerelements geprüft werden (Thema Zwischenablage) Gruß Hans-Jörg Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 (bearbeitet) wenn ich den code von oben anhänge, dann krieg ich den fehler: "Der name "Int" ist im aktuellen Kontext nicht vorhanden" fehler ist in der zeile mit dem if(Int.TryParse.........) was hab ich falsch gemacht? :-( das kann doch net so schwer sein in c# @Pointerman und henek: IntParse gibt ja nur true zurück wenn das Casting erfolgreich war. Wenn er allerdings keine Zahlen erlauben will ist das aus logischer Sicht der falschen Ansatzpunkt. Zumal wenn er folgenden String Castet : "abc32" weiß er bei tryparse das zeichen drinnen sind, aber nicht ob auch zahlen in dem string vorhanden sind. Nimm die von mir gepostete Lösung. Man kann das ganze natürlich auch als Funktion schreiben: private bool ContainsNumeric(string input) { foreach (char item in input) { if ((int)item > 47 && (int)item < 58) { return true; } } return false; } lg Gateway @HJST1979: Er sagte nur was von numerischen Zeichen nichts von "sonderzeichen". Übrigens sind die converter bei sowas sehr lückenhaft. wenn du den code mal in csharp einfügst wird er das übersetzte äquivalent als syntaxfehler angemerkt. Bearbeitet 13. Oktober 2011 von Gateway_man Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Oooh misst hab wohl seinen Satz falsch interpretiert, sorry. Meine Lösung geht dann sowieso nicht denn abc123 wäre auch NICHT numerisch sollte aber so wie ichs nun verstanden habe einen Fehler liefern sobald die Zahl "1" eingetippt wird. Gruß Hans-Jörg Zitieren
Klotzkopp Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Man kann das ganze natürlich auch als Funktion schreiben: So eine Funktion mag für vorzeichenlose Ganzzahlen gerade noch ausreichen, aber sobald man diesen kleinen Bereich verlässt, begibt man sich auf dünnes Eis. Die Prüfung, ob ein Text eine gültige Zahl darstellt, würde ich immer dem Framework überlassen. Spätestens bei kulturspezifischen Eigenheiten (z.B. Dezimaltrennzeichen) fällt man in der Regel auf die Nase, wenn man versucht, das selbst zu stricken. Zitieren
henek Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 klappt irgendwie net...... also das dier ist der komplette code meiner forms anwendung: 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 System.IO; namespace WindowsFormsApplication1 { public partial class emailLabel : Form { string name; string email; StreamWriter sw; string info; public emailLabel() { InitializeComponent(); } private void activate_Click(object sender, EventArgs e) { name = Convert.ToString(nameBox.Text); //Es wird ein Text in nameBox eingegeben// email = Convert.ToString(emailBox.Text); //""// sw = new StreamWriter(@"C:\Dokumente und Einstellungen\c.henek\Desktop\Neuer Ordner\out.txt"); sw.WriteLine("" + nameBox.Text + ""); //Übergabe der Werte an die Textdatei// sw.WriteLine("" + emailBox.Text + ""); sw.Close(); } private void button1_Click(object sender, EventArgs e) { Close(); } private void label1_Click(object sender, EventArgs e) { } private void emailBox_TextChanged(object sender, EventArgs e) { } private void infoButton_Click(object sender, EventArgs e) { info = Convert.ToString(label1.Text); label1.Text=("Von Carsten Henek \n 13.10.11"); } } } ich hoffe mal, dass hilft euch weiter :mod: Zitieren
henek Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 vllt. fehlt mir irgendein "using system" Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Also ich kann keine Art der Überprüfung in deinem Code finden ! Zitieren
henek Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 wo könnt ich die denn hinpacken....kann jemand meinen code nehmen und mir zeigen wo der code hinkommen könnte???? ich hab kein plan? Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 (bearbeitet) So eine Funktion mag für vorzeichenlose Ganzzahlen gerade noch ausreichen, aber sobald man diesen kleinen Bereich verlässt, begibt man sich auf dünnes Eis. Die Prüfung, ob ein Text eine gültige Zahl darstellt, würde ich immer dem Framework überlassen. Spätestens bei kulturspezifischen Eigenheiten (z.B. Dezimaltrennzeichen) fällt man in der Regel auf die Nase, wenn man versucht, das selbst zu stricken. Entweder ich habe das jetzt falsch verstanden oder du . Ich habe das so verstanden: Wenn der User eine Zahl in das Eingabefeld eingibt soll ein fehler geworfen werden. Das scheint mir damit durchaus legitim zumal die ascii tabelle in allen ländern dieser welt gleich ist. Im Framework scheint es aber für C# eine solche Funktion nicht zugeben, daher muss man sich selbst drum kümmern. Ich hatte das Problem schon seit einiger Zeit und habe auch lange nach alternative gesucht. Was du jetzt mit dem dezimaltrennzeichen meinst versteh ich nicht ganz. Das ist ja ein legitimes Komma und hat ein existenzrecht. Da jetzt in meiner Funktion jedes char in dessen numerischen ascii wert umgewandelt wird, seh ich da auch keine verwechslungsproblematik. EDIT: 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 System.IO; namespace WindowsFormsApplication1 { public partial class emailLabel : Form { string name; string email; StreamWriter sw; string info; public emailLabel() { InitializeComponent(); } private void activate_Click(object sender, EventArgs e) { name = Convert.ToString(nameBox.Text); //Es wird ein Text in nameBox eingegeben// email = Convert.ToString(emailBox.Text); //""// sw = new StreamWriter(@"C:\Dokumente und Einstellungen\c.henek\Desktop\Neuer Ordner\out.txt"); sw.WriteLine("" + nameBox.Text + ""); //Übergabe der Werte an die Textdatei// sw.WriteLine("" + emailBox.Text + ""); sw.Close(); } private void button1_Click(object sender, EventArgs e) { Close(); } private void label1_Click(object sender, EventArgs e) { } private void emailBox_TextChanged(object sender, EventArgs e) { string result = string.Empty; foreach (char item in emailBox.Text) { if ((int)item > 47 && (int)item < 58) { MessageBox.Show("Keine Zahlen bitte"); } else { result += item; } } emailBox.Text = result; } private void infoButton_Click(object sender, EventArgs e) { info = Convert.ToString(label1.Text); label1.Text=("Von Carsten Henek \n 13.10.11"); } } } Wenn mich jetzt nicht alles täuscht.... Bearbeitet 13. Oktober 2011 von Gateway_man Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Ich würde sagen dir fehlts an den Grundlagen Code von Gateway_man ist das TextChanged Event (Ereignis) -> Siehe Designer private void textBox1_TextChanged(object sender, EventArgs e) Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Übrigens den string convert auf die Text Property der Textboxen kannst du dir schenken, deren return werte sind bereits vom typ string . Zitieren
henek Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 vielen dank gateway man..... hat mir super weitergeholfen das problem ist jetzt nur, dass die überprüfung für die emailBox gilt.......ich brauch die für die nameBox und wenn ich die emailBox "in der schleife", durch ein nameBox ersetze, das Programm immer wieder hängenbleibt :-( Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Mach wieder alles soweit rückgängig, das es wieder geht, dann geh in den designer und mach einen doppelklick auf die entsprechende Textbox. Nun solltest du wieder im Codeeditor sein und an der aktuellen cursorposition setzt du dann folgenden code ein: string result = string.Empty; foreach (char item in ((TextBox)sender).Text) { if ((int)item > 47 && (int)item < 58) { MessageBox.Show("Keine Zahlen bitte"); } else { result += item; } } ((TextBox)sender).Text = result; Du solltest dir aber lieber (wie HJST1979 bereits angemerkt hat) einige einsteiger tutorials reinziehn. Hier im .NET Forum gibts einen sticky post mit openbooks in jeglichen Bereichen. Zitieren
Sacaldur Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 zu dem Missverständnis: der eine von euch beiden hat verstanden, dass der eingegebene Text alle möglichen Zeichen enthalten darf, aber keine Ziffern (0, 1, 2, 3, 4, 5, 6, 7, 8 oder 9) und der andere hat verstanden, dass der eingegebene Text alles sein darf, nur keine gültige Zahl (irgendwas zwischen -∞ und +∞) ich gehe zwar vom 1. aus, allerdings ist die Definition nicht genau (und lässt eher auf letzteres schließen) man sollte aber auch hinterfragen, wofür diese Einschränkung vorhanden ist sollte es vielleicht nicht noch mehr Einschränkungen geben? (dürfen Satzzeichen eingegeben werden? darf ein ∞ eingegeben werden? ...) ich denke, es wäre vielleicht besser, nicht einzelne Zeichen zu verbieten, sondern einzelne Zeichen zuzulassen man könnte es dann wieder mit einem Prüfen aller Zeichen angehen oder man bedient sich regulärer Ausdrücke ^^ (wesentlich einfacher, allerdings ggf. etwas Aufwendiger bei der Durchführung, was in dem Fall allerdings nicht so zum Tragen kommen würde) Tutorial anschauen: ja, das könnte gut tun @Gateway_man: du hättest den Text ja auch ruhig wieder zurück setzen können =P (wenn man erstmal 10 Zahlen eingegeben hat, dürfte das weg klicken der Meldungen zu einer Qual werden... x) ) und wenn wir schon dabei sind: warum erstellt er nicht sein eigenes Steuerelement, welches keine Zahlen zulässt ;D (das wäre wesentlich angenehmer für den Benutzer, der sich nicht mehr mit hunderten von Meldungen rumschlagen muss, nur weil er mal 10 Zahlen eingegeben hat ) Zitieren
Gateway_man Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 @Gateway_man: du hättest den Text ja auch ruhig wieder zurück setzen können =P (wenn man erstmal 10 Zahlen eingegeben hat, dürfte das weg klicken der Meldungen zu einer Qual werden... x) ) und wenn wir schon dabei sind: warum erstellt er nicht sein eigenes Steuerelement, welches keine Zahlen zulässt ;D (das wäre wesentlich angenehmer für den Benutzer, der sich nicht mehr mit hunderten von Meldungen rumschlagen muss, nur weil er mal 10 Zahlen eingegeben hat ) Text wird ja zurückgesetzt (sprich ohne die Zahlen xD). Ja die MessageBox kann er ja durch irgendwas anderes ersetzten. Solange niemand etwas in die Textbox einfügt (copy&paste) wird er auch immer nur eine MessageBox erhalten, da es ja im textchange event drin ist. Das mit der customized textbox ist schon richtig. Wenn man aber das basiswissen des TE sieht, halte ich es eher für unmöglich ihm jetzt zu erklären, wie er ein eigenes Steuerelement schreibt beziehungsweise ein Steuerelement schreibt das von der Textbox erbt. lg gateway Zitieren
HJST1979 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Hallo ich denke auch, dass er ein eigenes Steuerlement (wo er erstmal das gleiche Problem lösen muss) aufgrund seines Wissensstandes nicht hinbekommt -> Ist nicht böse gemeint, aber dafür sollte man schon einiges an Grundwissen mitbringen, was er nach so kurzer Zeit einfach noch nicht haben kann. Gruß Hans-Jörg Zitieren
lilith2k3 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Wie wäre es damit: namespace MyExtensions { public static class StringExtensionmethods { public static bool containsNumbers(this string text) { Regex numeric = new Regex(@"[0-9]+"); return numeric.Match(text).Success; } } } [/php] Schreibe eine Extension-Method, die überprüft, ob ein String Zahlen enthält. Aufruf wäre dann wie folgt: [php] string test = "Test1"; Console.WriteLine(test.containsNumbers()); Somit hättest Du den Fall erschlagen, dass Ziffern in irgendeiner Art und Weise vorkommen. Ob das dann auch eine valide Zahl ist, kann man so nicht sagen. Jenachdem, welcher Typ in Frage käme, kannst Du ja eine der $Datentyp.TryParse()-Varianten nutzen. Zitieren
Sacaldur Geschrieben 14. Oktober 2011 Geschrieben 14. Oktober 2011 (bearbeitet) @Gateway_man: stimmt, soweit hatte ich deinen Quelltext wohl nicht gelesen (da ich schon auf den ersten Blick gesehen/gedacht habe, dass es den Zweck erfüllt) wie du ja schon geschrieben hast, würde maximal beim Einfügen über c&p mehr als 1 Ziffer eingefügt werden können man könnte das jetzt weiterhin auf diese Art fortsetzen (mit einem boolean speichern, ob eine Meldung ausgegeben wurde und bei weiteren Treffern keine Meldung mehr ausgeben) oder man prüft erst mittels regulärer Ausdrücke, ob eine oder mehrere Ziffern anthalten sind und entfernt dann alle Ziffern mit Hilfe eines regulären Ausdrucks =) dadurch würde der Code um ein paar Zeilen kürzer werden (dass dafür im .NET Framework ein wenig Code liegt, der jetzt zusätzlich ausgeführt wird, interessiert doch nicht und dass dieser evtl. zusätzlich Rechenzeit benötigt: die Rechner werden ja eh immer schneller ;D) eigenes Steuerelement: ja, zum jetzigen Zeitpunkt würde ich dem Ersteller des Themas auch nicht dazu raten (aber ich wollte ja von Gateway_man, dass er das macht ;D) allerdings kommt irgendwann bestimmt der Zeitpunkt, ab dem das dann auch kein Problem mehr ist zu dem Problem mit den Textboxen: es ist durchaus möglich, diesen Eventhandler für 2 Elemente zu verwenden allerdings ist es nicht sehr sinnvoll, in E-Mail Adressen Ziffern zu verbieten dort wäre es sinnvoller, Leerzeichen (oder die Endung "@googlemail.com" ^^) zu verbieten man könnte entweder für beide Fälle einen Eventhandler schreiben oder man versucht eine allgemeingültige Lösung zu suchen (eine Methode, die bestimmbare Zeichen herausfiltert) und diese aus den beiden Eventhandlern heraus aufrufen Edit: @lilith2k3: verwendest du grundsätzlich die PHP-Tags, wenn du Code einfügen willst? oO (es gibt auch den allgemeinen Tag CODE für Quellcode) Edit2: @lilith2k3: bisher habe ich diese Möglichkeit gekannt, also danke dafür, dass du dafür ein Beispiel geschrieben hast =) wie würde es denn aussehen, wenn mehrere Klassen versuchen, die gleiche Methode zu definieren? (also mit gleichem Namen und gleichen Parametern) muss man dem Compiler/"Interpreter" noch mitteilen, dass genau diese Methode ausgeführt werden soll? (beispielsweise durch ein using o. ä.) Bearbeitet 14. Oktober 2011 von Sacaldur Zitieren
Gateway_man Geschrieben 14. Oktober 2011 Geschrieben 14. Oktober 2011 eigenes Steuerelement: ja, zum jetzigen Zeitpunkt würde ich dem Ersteller des Themas auch nicht dazu raten (aber ich wollte ja von Gateway_man, dass er das macht ;D) Na denn , da ist deine TextBox: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { /// <summary> /// Textbox which doesn't allow numeric input /// </summary> public class ExtendedTextBox : TextBox { #region public event EventHandler<InvalidInputEventArgs> InvalidNumericInput; #endregion protected override void OnTextChanged(EventArgs e) { string result = string.Empty; bool bInvalid = false; int curserposition = this.SelectionStart; foreach (char item in base.Text) { if ((int)item > 47 && (int)item < 58) { bInvalid = true; } else { result += item; } } if (bInvalid && InvalidNumericInput != null) InvalidNumericInput(this,new InvalidInputEventArgs(base.Text,result)); base.Text = result; if (bInvalid) { if (curserposition > 0) { if (base.Text.Length < curserposition) { base.Select(base.Text.Length, 0); } else { base.Select(curserposition - 1, 0); } } } base.OnTextChanged(e); } } public class InvalidInputEventArgs : EventArgs { #region Fields private string _originalinput = string.Empty; private string _changedinput = string.Empty; #endregion public InvalidInputEventArgs(string orginialinput, string changedinput) : base() { _originalinput = orginialinput; _changedinput = changedinput; } #region Properties public string OrginialInput { get { return _originalinput; } } public string ChangedInput { get { return _changedinput; } } #endregion } } Kannst es natürlich auch mit RegEx machen, ich persönlich lass die Finger davon, da ich mich mit den Pattern kein Stück auskenne und ehrlich gesagt auch wenig Lust habe mir dieses wirrwar anzutun . Zumal halte ich es für schwerer lesbar zumindest bei größeren Expressions. Da tue ich demjenigen, der eventuell nach mir mit dem Code arbeitet, keinen Gefallen. lg Gateway Zitieren
lilith2k3 Geschrieben 14. Oktober 2011 Geschrieben 14. Oktober 2011 @lilith2k3: verwendest du grundsätzlich die PHP-Tags, wenn du Code einfügen willst? Ja. Weil's so schön bunt ist wie würde es denn aussehen, wenn mehrere Klassen versuchen, die gleiche Methode zu definieren? (also mit gleichem Namen und gleichen Parametern) muss man dem Compiler/"Interpreter" noch mitteilen, dass genau diese Methode ausgeführt werden soll? (beispielsweise durch ein using o. ä.) Extension Methods sind Methoden, die Du an jede Klasse anhängen kannst. Es sieht ja so aus, dass eine Extension Method eine bestehende Klasse erweitert: public static bool containsNumbers(this string text) [/php] erweitert den Datentyp [i]string[/i]. Gäbe es eine zweite Klasse, die die selbe Methode der string-Klasse hinzufügen wollen würde, wärest Du gezwungen [i]using[/i] zu verwenden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.