Zum Inhalt springen

try und catch


henek

Empfohlene Beiträge

ich hab da noch ein problem :rolleyes: :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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Pointerman
Falsche Methode aufgerufen
Link zu diesem Kommentar
Auf anderen Seiten teilen

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#.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D. 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 von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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 :D)

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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 von Sacaldur
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :P, 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 :P. 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@lilith2k3:

verwendest du grundsätzlich die PHP-Tags, wenn du Code einfügen willst?

Ja. Weil's so schön bunt ist :D

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...