Entwickler-Ecke

WinForms - Keypress event


sepp_a_u - So 30.12.07 13:43
Titel: Keypress event
hi @ll

mache mir gerade einen kl. zinsrechner. der läuft jetzt auch einwandfrei. man kann nur noch zahlen eingeben und die eingabe von buchstaben ist unmöglich. jedoch bräuchte ich jetzt noch den befehl dazu, dass auch das "," und der "." zulässig sind für die eingabe. wie mache ich das?
folgenden code habe ich bisher verwendet, dass man nur noch zahlen eingeben kann in den 3 txtboxen (startkap, laufzeit in jahre, zinssatz):


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
private void txtStartkap_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
            {
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                {
                    e.Handled = true;
                }
            }

            private void txtLaufzeit_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
            {
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                {
                    e.Handled = true;
                }
            }

            private void txtZins_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
            {
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                {
                    e.Handled = true;
                }
            }


damit jetzt komma und pkt zulässig sind, gibt es doch bestimmt auch einen solchen befehl. oder nicht? wäre nice, wenn mirwer helfen könnte

mfg


JüTho - So 30.12.07 14:14
Titel: Re: Keypress event
user profile iconsepp_a_u hat folgendes geschrieben:

damit jetzt komma und pkt zulässig sind, gibt es doch bestimmt auch einen solchen befehl. oder nicht? wäre nice, wenn mirwer helfen könnte

Unmittelbar gibt es keine passenden Abfragen, weil die Char.IsXXX-Methoden Gruppen von Unicode-Zeichen prüfen. Du kannst diese Zeichen aber direkt kontrollieren, wie es im Beispiel zur KeyPressEventArgs.KeyChar-Eigenschaft vorgemacht wird:

C#-Quelltext
1:
2:
3:
4:
if (e.KeyChar != (char)Keys.Decimal && e.KeyChar != (char)Keys.Separator)
{
    e.Handled = true;
}

Ob Keys.Separator richtig ist, musst Du ausprobieren; sonst suche Dir etwas anderes aus der Keys-Enumeration aus. Jürgen


sepp_a_u - So 30.12.07 14:33

hmm danke erstmal. aber der code funktioniert bei mir gar nicht. hab auch andere events außer dem separator ausprobiert. wenn ich den code dann einfüge, dann kann man gar nichts mehr in die txtfelder eingeben.

mfg


Kha - So 30.12.07 16:19

Auf die Idee mit der Keys-Enumeration wäre ich gar nicht gekommen, aber ein simpler Cast nach Char wird wohl nur Unfug ergeben. Wenn, dann über KeyDown/Up, dort gibt es nämlich mit e.KeyCode eine Keys-Eigenschaft.
Ansonsten eben über CultureInfo.CurrentCulture.NumberFormat.


sepp_a_u - So 30.12.07 18:14

hmm das sagt mir leider gar nichts :(
hast du dafür vll einen kommentierten bspcode oder?
wäre nice, damit ich wenigstens weiß, was du mir überhaupt sagen willlst :(

mfg


Kha - So 30.12.07 18:27

Mit Keys wird es doch nichts, bleib bei der Betrachtung von Chars. Und um Globalization würde ich mir auch keine Sorgen machen - prüfe einfach, ob KeyChar weder '.' noch ',' ist.

PS: Du musst den gleichen Code doch nicht dreimal schreiben. Verknüpfe die drei Events mit einer einzigen Methode über die Dropdownbox im Form-Designer.


sepp_a_u - So 30.12.07 19:36

user profile iconKhabarakh hat folgendes geschrieben:
Mit Keys wird es doch nichts, bleib bei der Betrachtung von Chars. Und um Globalization würde ich mir auch keine Sorgen machen - prüfe einfach, ob KeyChar weder '.' noch ',' ist.

PS: Du musst den gleichen Code doch nicht dreimal schreiben. Verknüpfe die drei Events mit einer einzigen Methode über die Dropdownbox im Form-Designer.


hmm leider habe ich keien ahnung wie ich das mit der verknüpfung realisieren soll/muss, genauso wenig, wie ich das mit keychar machen muss mit dem pkt und komma. bin ja leider noch ein extremer anfänger :( wäre nice, wenn du mir da mal ein codebsp machen könntest

mfg


sepp_a_u - Fr 04.01.08 18:33

hmm kann mir keiner helfen? ;(

mfg


Christian S. - Fr 04.01.08 18:36

Wie hast Du denn versucht, die hier gegebenen Tipps umzusetzen? Zeig doch mal, wo Du bei der Umsetzung der Tipps nicht weiter kommst.


sepp_a_u - So 06.01.08 13:44

so habs jetzt endlch herausgefunden, wie ich es machen kann:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private void txtStartkap_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
          {
              if (!(e.KeyChar == '.' || e.KeyChar == ','))
              {

                  if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
                  {
                      e.Handled = true;
                  }
              }
          }


was hält ihr von dem code? ist der sinnvoll oder eher nicht?

MfG


JüTho - So 06.01.08 14:02

Warum fragst Du eigentlich, ob ein Zeichen ein Steuerzeichen ist?

Was hältst Du von einer einzigen Abfrage:

C#-Quelltext
1:
2:
3:
4:
5:
private void txtStartkap_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if ( !(e.KeyChar == '.' || e.KeyChar == ',') && !Char.IsDigit(e.KeyChar) )
       e.Handled = true;
}

Noch besser könnte die Positiv-Abfrage sein, denn Dich interessieren doch nur Ziffern, Komma und Punkt:

C#-Quelltext
1:
2:
    if ( ! (e.KeyChar == '.' || e.KeyChar == ',' || Char.IsDigit(e.KeyChar)) ) 
       e.Handled = true;

Gruß Jürgen