Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Probleme mit PerformClick() ?!
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

Probleme mit PerformClick() ?!

beantworten | zitieren | melden

Morgen zusammn, ich habe folgendes Problem, ich habe für die Schule ein 1 zu 1 Nachbau des WinXP-Calculators und es funktioniert alles soweit ganz gut, nur wenn ich über KeyDown die Tastatur abfange und dann mit .PerformClick() sachen ausführe kommt folgender Fehler:

Aufruf (z.B.)


switch (e.KeyCode)
{
       case Keys.Enter: btn_gleich.PerformClick();
             break;
}

Das Click-Ereignis das wunderbar funktionier wenn ich mit der Maus auf den Button Klicke


        private void btn_gleich_Click(object sender, EventArgs e)
        {                                                       
            if (tbxeingabe.Text != "Teilen durch 0 unmöglich.")
            {

                char[] kommatest = new char[tbxeingabe.Text.Length];
                string ergtemp = ""; //zwischenspeichern des ergebnis
                bool komma = false; //ob komma vorhanden ist

                switch (operand)
                {
                    case '+':
                        {
                            if (!leoschen || mread || einsdurchx)
                                zweitezahl = Convert.ToDouble(tbxeingabe.Text);

                            ergebnis += zweitezahl;
                            ergtemp = Convert.ToString(ergebnis);
                            kommatest = ergtemp.ToCharArray();

                            for (int i = 0; i < ergtemp.Length; i++)
                                if (kommatest[i] == ',')
                                    komma = true;

                            if (komma)
                                tbxeingabe.Text = Convert.ToString(ergebnis);
                            else
                                tbxeingabe.Text = Convert.ToString(ergebnis) + ",";
                            break;
                        }
                    case '-':
                        {
                            if (!leoschen || mread || einsdurchx)
                                zweitezahl = Convert.ToDouble(tbxeingabe.Text);

                            ergebnis -= zweitezahl;
                            ergtemp = Convert.ToString(ergebnis);
                            kommatest = ergtemp.ToCharArray();

                            for (int i = 0; i < ergtemp.Length; i++)
                                if (kommatest[i] == ',')
                                    komma = true;

                            if (komma)
                                tbxeingabe.Text = Convert.ToString(ergebnis);
                            else
                                tbxeingabe.Text = Convert.ToString(ergebnis) + ",";
                            break;
                        }
                    case '/':
                        {
                            if (!leoschen || mread || einsdurchx)
                                zweitezahl = Convert.ToDouble(tbxeingabe.Text);
                            if (zweitezahl != 0)
                            {
                                ergebnis /= zweitezahl;
                                ergtemp = Convert.ToString(ergebnis);
                                kommatest = ergtemp.ToCharArray();

                                for (int i = 0; i < ergtemp.Length; i++)
                                    if (kommatest[i] == ',')
                                        komma = true;

                                if (komma)
                                    tbxeingabe.Text = Convert.ToString(ergebnis);
                                else
                                    tbxeingabe.Text = Convert.ToString(ergebnis) + ",";
                            }
                            else
                                tbxeingabe.Text = "Teilen durch 0 unmöglich.";

                            break;
                        }
                    case '*':
                        {
                            if (!leoschen || mread || einsdurchx)
                                zweitezahl = Convert.ToDouble(tbxeingabe.Text);

                            ergebnis *= zweitezahl;
                            ergtemp = Convert.ToString(ergebnis);
                            kommatest = ergtemp.ToCharArray();

                            for (int i = 0; i < ergtemp.Length; i++)
                                if (kommatest[i] == ',')
                                    komma = true;

                            if (komma)
                                tbxeingabe.Text = Convert.ToString(ergebnis);
                            else
                                tbxeingabe.Text = Convert.ToString(ergebnis) + ",";
                            break;
                        }
                }

                leoschen = true;
                userkomma = false;
                gleichZeichen = true;
                mread = false;
                einsdurchx = false;
                if (btn_gleich.Focused)
                    tbxeingabe.Focus();
                tbxeingabe.DeselectAll();

            } 
            else
                System.Media.SystemSounds.Beep.Play();
        }

(Is keine Profi-Arbeit ich weis :D)

Der Fehler der kommt wenn ich das 2te mal mit Enter da rein gehe(beim ersten druck auf Enter kommt also kein fehler, erst beim 2ten)

Wäre nett wenn jemand helfen könnte.
Attachments
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
JunkyXL
myCSharp.de - Experte

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

Ganz grundsätzlich geht es bei dem Fehler wohl darum, dass ein ein nicht-numerischer Wert nach Double gecastet werden soll. Wie willst du aus einem Komma z.B. auch nen Zahlenwert erhalten.
Was steht denn zu diesem Zeitpunkt in 'tbxeingabe.Text' ?
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Zu diesem Zeitpunkt kann da eine belibiege Zahl stehen(ich habs ausgetestet) aber er zeigt an dass das Feld leer ist und deshalb gibs beim Umwandeln das Problem

PS: Aber sonst habe ich keine Probleme mit dem Umwandeln.
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
nin
myCSharp.de - Member

Avatar #avatar-2166.gif


Dabei seit:
Beiträge: 738
Herkunft: graz,AT

beantworten | zitieren | melden

beim umwandeln von string in einen Datentypen wie int, double, etc,.. empfiehlt sich immer:


double.TryParse();
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Wäre nett wenn du mir sagen könntest was genau TryParse() macht und wie ich damit umwandle, da ich Anfänger bin!
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ToFac3,

das ist definitiv eine Frage an die SDK-/MSDN-Doku, nicht an uns.

herbivore
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Aber die MSDN fühlt sich schon vergewaltigt so offt wie ich drin bin :evil:
Natürlich kucke ich in die Hilfe aber die is gar nicht so hilfreich, zumindestens nicht immer.
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
nin
myCSharp.de - Member

Avatar #avatar-2166.gif


Dabei seit:
Beiträge: 738
Herkunft: graz,AT

beantworten | zitieren | melden

aber genau so fragen wie: "wie funktioniert TryParse()" sind eindeutig fragen für die hilfe
gerade bei TryParse ist die MSDN ewig lang, inkl. bsp und so....
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ToFac3,

wie man double.TryParse benutzt erklärt sie sehr ausführlich, sogar mit Codebeispielen. Nochmal: Wie man eine Methode benutzt, ist eine Frage an die Doku und nicht an uns.

herbivore
private Nachricht | Beiträge des Benutzers
JunkyXL
myCSharp.de - Experte

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

Falls du VS benutzt; ist die Code-Dokumentation so schlecht in den .NET Klassen?
Der Name sagt schon aus, dass (try) versucht wird ein Objekt umzuwandeln (Parse).
Du kannst aber folgendes machen:

try
{
   double dValue = Convert.ToDouble(tbxeingabe.Text);
}
catch { }
das ist grob gesagt in etwa das, was in TryParse passiert. Jedenfalls erhältst du so das selbe Ergebnis ohne Exception.

Allerdings halte ich dein Problem an dieser Stelle ein Problem in deiner Architektur des Programms. Zu diesem Zeitpunkt sollte da nichts schiefgehen dürfen.

Schau mal nach MaskedTextBox. Versuch die Funktionalität der Eingabemöglichkeiten abzukapseln (Kommaeingabe, usw...)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JunkyXL am .
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Ok jetzt weis ich das ich damit teste ob umgewandelt werden kann, nur hilft mir das leider nicht weiter, dann kommt zwar ein False und die Fehlermeldung gibs nicht mehr
aber es hilft mir nicht weiter, denn eigentlich steh ja ne Zahl in der Textbox und wenn ich aber durch Enter mit .PerformClick() (wenn ich das zweite mal Enter drücke wohl gemerkt) hinspringe kommt ein Fehler oder jetzt eben kein Fehler mehr sonder dann passier halt nichts. Er sollte aber addieren, was er auch tut wenn ich mit der Maus klicke!

Hilfe!!



MfG ToFac3
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Die textbox is readonly=true, mann kann da entweder per mausdruck auf die entsprechende Buttons oder per tastatur was eingeben, aber ich lasse nur Zahlen durch, von daher weis ich auch nicht was das soll, wie gesagt da steht zu dem Zeitpunkt eine Zahl drin, ne ganz normale Zahl.

MfG ToFac3
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
nin
myCSharp.de - Member

Avatar #avatar-2166.gif


Dabei seit:
Beiträge: 738
Herkunft: graz,AT

beantworten | zitieren | melden

du selbst schreibst auf "tbxeingabe.Text" ein komma (einen beistrich um genau zu seien, ein punkt wäre okay)

damit kann Convert.ToDouble() nichts anfangen, und wirft eine exception
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ToFac3,

wenn die Exception kommt, steht eben keine Zahl drin oder zumindest keine im richtigen Format (also entsprechend der Ländereinstellungen). So einfach ist das. Lerne den Exceptionmeldungen zu vertrauen. :-)

herbivore
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Aber ja, er zeigt ja auch an(wenn ich mit der maus über tbxeingab.text fahre) dass das Feld leer ist, was aber nicht der Fall ist da steh auf jeden fall eine Zahlm, oder hab ich im Code irgenwo ein Fehler den ich nicht sehe?

PS: Danke für alle Antworten


MfG ToFac3
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

naj was oll z.b. das hier?


if (komma)
  tbxeingabe.Text = Convert.ToString(ergebnis);
else
  tbxeingabe.Text = Convert.ToString(ergebnis) + ",";
break;

und genau das ist das problem... 23, ist nun mal keine zahl.... geh einfach mal das programm im debugger durch und schau dir die variableninhalte an
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Ja da hast du recht 23, ist keine Zahl, aber 23, ist das selbe wie 23,00 o.ä und daher wird das komma beim addieren, subtrahieren usw vernachlässigt und ist nicht mehr da im Ergebnis (23, + 10, = 33) und daher gibs in dem sinne keine Fehlermeldung!
Ein Komma kann im Ergebnis nur dann entstehen wenn ich z.b. (12,5 + 10 = 22,5) sowas mache, und daher prüfe ich ob komma schon da ist und wenn nicht füge ich eins hinzu, iwe es eben der WinXP-Rechner auch macht!
Auserdem sag ich doch dass es reibungslos funktioniert wenn ich mit der maus auf die buttens klicke, also muss es, ich weis auch nicht wo liegen ?!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ToFac3 am .
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
nin
myCSharp.de - Member

Avatar #avatar-2166.gif


Dabei seit:
Beiträge: 738
Herkunft: graz,AT

beantworten | zitieren | melden

hi,

die von dir angehängt Fehlermeldung sagt ganz klar, dass zu dem Zeitpunkt wo die zeile mit dem Convert ausgeführt wird in "tbxeingabe.Text" irgendwas steht, was nicht da sein sollte, und nicht in double convertiert werden kann. Wo der Wert gesetzt wird, solltest du wissen. Wenn nicht debugge dein programm doch mit F10 SchrittfürSchritt durch, füge "tbxeingabe.Text" zum Watch hinzu und schau wo ein Wert gesetzt wird, der keine Zahl ist.

Wenn das problem weiter besteht, versuch mit einem minimal Programm den "Fehler zu reproduzieren". Dieses programm kannst du dann notfalls auch hier online stellen.
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

@ToFac3
hm ok, wußt ich nicht das er so kulant da ist

de ntip mit dem debugger trotzdem mal machen^^

was mir noch aufgefalle nist:
in deinem switch hast du ne menge redundanten code... versuch doch ein paar allgemeine sachen vor bzw hinter das switch zu verlegen, und so sachen wie mit dem komma in eine methode auslagern... dann schauts auch gleich bissl kompakter aus =)
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Danke für die Tipps@sheitman und nin, werds gleich mal alles ausprobieren!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ToFac3 am .
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

Zitat
if (!leoschen || mread || einsdurchx)
ach ja, falls du umlaute meidest, ö schreibt man oe nicht eo^^
private Nachricht | Beiträge des Benutzers
Borg
myCSharp.de - Member



Dabei seit:
Beiträge: 1.529
Herkunft: Berlin, Germany

beantworten | zitieren | melden

Zitat
falls du umlaute meidest
Was allerdings technisch gesehen nicht nötig ist, da .NET auf Unicode basiert.
Nur wenn du deine Klassen an anderssprachige (bzw. anderstastaturlayoutige) weitergibst, sollten alle öffentlichen Klassen, Methoden und Felder in lateinischen Buchstaben geschrieben sein.
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Das ist nur für alle Fälle, die Umlaute schreibe ich immer aus, sprich ö=eo usw.
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
nin
myCSharp.de - Member

Avatar #avatar-2166.gif


Dabei seit:
Beiträge: 738
Herkunft: graz,AT

beantworten | zitieren | melden

@ToFac3

dass das falsch ist und eigentlich ö--> oe richtig wäre ist die aber bewusst oder?
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

Zitat
dass das falsch ist und eigentlich ö--> oe richtig wäre ist die aber bewusst oder?
worum es mir bei meinem beitrag eigentlich ging :tongue:

hat sich denn schon was beim debuggen ergeben?
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Der Fehler ist imma noch da, ich habe zwar jetzt einege sachen in methoden ausgelagert aber der Fehler kommt trozdem, in der textbox steh was drin(eine Zahl) er zeigt aber an dass sie leer ist und deshalb gibs fehlermeldung beim umwandel, ich weis auch net weiter, muss wohl in 3 wochen meinen Dozent mal fragen ob er weiter weis.


PS: Ich weis natürlich das ö=oe ist und nicht umgekehrt
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

kannst du dein projekt mal anhängen oer steht das unter irgendwelchen auflagen?
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Nein das tut es nicht, hier kommt das Ding 8)

EDIT: Wie gesagt mit der Maus rumklicken kein Problem, mit der Tastatur gibs ärger!

EDIT2: Wäre nett wenn du deine Meinung dazu schreiben könntest oder verbesserungsvorschläge
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von ToFac3 am .
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers
sheitman
myCSharp.de - Member



Dabei seit:
Beiträge: 1.047

beantworten | zitieren | melden

netter klon^^

zwei dinge gleich zu beginn:
1. die infobox läd recht lange, was wohl ok is weil du paar daten sammelst, aber optisch schauts bei mir bissl putzig aus. ich benutzt das windows 2000 theme unter xp... da sind dann einige stellen weiß was nicht wirklich schick aussieht

2. problem konnte rekonstruiert werden... so mal schaun was faul is^^
private Nachricht | Beiträge des Benutzers
ToFac3
myCSharp.de - Member

Avatar #avatar-2259.jpg


Dabei seit:
Beiträge: 30
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

1. Freut mich dass du das Ding magst
2. Ich freu mich schon auf deine Vorschläge!
Wem die Scheisse bis zim Hals steht, der sollte den Kopf nicht hängen lassen.
private Nachricht | Beiträge des Benutzers