c# Windows Form Einlesen von Fließkommazahlen/formatiertes Einlesen
-
Hallo,
ich probiere seit einigen Tagen mit C# herum und bin von der Entwicklungsumgebung total begeistert.
Aber wie so üblich, hat man doch einige Probleme im Anfang. Der Funktionsumfang ist so groß, das kommt alles nicht über Nacht.
Ich habe mir meine erste Windows-Form Applikation gebaut, mit der Navigation usf. alles kein Problem, nun weiß ich aber nicht, wie ich
Fließkommazahlen formatiert einlesen soll. Der Anwender soll nur Fließkommazahlen eintippen dürfen, und das soll während der Eingabe schon kontrolliert bzw. zurückgewiesen werden.
Ich finde einfach in der Toolbox nicht die richtige Struktur für solche Eingaben. Bei container aus Panel sieht man z. B. bei Bindungen erweitert im Fenster Formatierung und erweiterte Bindung ein Formatierungsmenü, leider ist das blaß unterlegt, die Optionen wären z. B. numerisch, datum, Benutzerdefiniert. Das wär genau das, was gebraucht würde, wie nimmt man das in Betrieb?
MfG Pascal2009
-
Hmm mir würden da zwei dinge einfallen.Entweder eine MaskedTextBox oder Reguläre Ausdrücke bei der Validierung der Textbox.
-
Firefighter schrieb:
Hmm mir würden da zwei dinge einfallen.Entweder eine MaskedTextBox oder Reguläre Ausdrücke bei der Validierung der Textbox.
Ist die MaskedTextBox ein Standardelement aus der Toolbox?
MfG Pascal2009
-
Bei Visual Studi 2008 Professionell bin ich mir da sicher das du es unter den Windows Steuerelementen findest.
-
Ich hab die TextBox jetzt mal reingezogen, heißt nur TextBox.
Und wieder dasselbe, bei Formatierung kriege ich das Menu nicht scharf, wo ich numerische Formatierung einstellen könnte. Muß ich an den Eigenschaften der textbox vorher was ändern?
MfG Pascal2009
-
Nein eigentlich sollte das Ding direkt MaskedTextBox heißen, was für ein visual Studio benutzt du?
-
Firefighter schrieb:
Nein eigentlich sollte das Ding direkt MaskedTextBox heißen, was für ein visual Studio benutzt du?
Microsoft VisualC#2008 Express Edition
Das was man free downloaden kann.
MfG Pascal2009
-
**********ENTWARNUNG
Hab das Ding entdeckt!
Versuch jetzt mal mein Glück.
Ergebnis: Das macht er soweit. Aber das Trennzeichen paßt sich nicht an. Wenn das Format
0000.000 ist, zeigt er ein häßliches Ausgabefenster mit _, interessanterweise mit Komma, und man muß dann alle Vorkommaziffern eingeben, weil sich das Trennzeichen nicht verschieben läßt durch Drücken der . taste.
Leider hat die Hilfe nichts dazu zu sagen, die ist irgendwie nur zur Hälte installiert, obwohl ich mich bei MSC registriert habe.
WEnn man das über die Hilfefunktion abrufen könnte, würde ich natürlich hier das Forum nicht in Anspruch nehmen.
Gruß Pascal
-
Hehe wollte grad ein Bild posten, ansonsten helfen dir eventuell Regualar Expression bei der Validierung des Stringes in eine Floatgerechte Zahl
-
Firefighter schrieb:
oder Reguläre Ausdrücke bei der Validierung der Textbox.
Ich hab das jetzt soweit, daß die häßlichen ___ weg sind, und mit #####.### das Format soweit vorgegeben.
Das ist aber auch nicht das Gelbe vom Ei. Nämlich: Der Prompt steht fest, läßt sich mit . nicht verschieben. Das ist also sehr unhandlich, einmal 0.2 einzugeben und dann wieder -147.0, und drittens könnten die Zahlen auch größer sein oder mehr Nachkommastellen haben, dann wird es noch umständlicher, weil das kein Fließkomma ist sondern fester Prompt.
Daher wäre es womöglich besser, das MaskedTextBox nicht zu verwenden, sondern den Anwender eintippen zu lassen wie er will und dann zu validieren. Wie schon vorgeschlagen.
Kannst du mir da mal einen Dreizeiler hinsetzen, wie ich den Wert aus diesem Fenster verwalten könnte?
Gruß Pascal2009
Komplett sieht das so aus:
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;namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{}
private void Form1_Load(object sender, EventArgs e)
{}
private void maskedTextBox1_DragEnter(object sender, DragEventArgs e)
{}
}
}
-
Da ich Regex auch noch nicht so perfekt beherrsche, kann ich dir nur Google ans Herz legen und einfach mal mit "C# Regex" drauf los zu googlen. So habe ich auch angefangen.Ehe ich hier was falsches Poste lass ich das lieber
-
Schau Dir Validating Deiner Textbox an. Vllt. noch den ErrorProvider.
TryParse kann auch Hilfreich sein, aber schön auf die Spracheinstellungen achten.
-
Ich habe mir für die Validierung im Internet mal Schnipsel angesehen, das ist ja alles furchtbar aufwendig außerdem verstehe ich den Code nicht und weiß nicht, wo ich den einbinden soll.
Viel lieber würde ich es innerhalb der Win-Applikation so machen:
eigene Funktion
int Valid_string(string)
{
Schleife auf
string aus dem Eingabefeld übernehmen
in der gesamten Stringlänge absuchen, ob falsche Zeichen drin sind
danach error setzen 0 oder 1
return(errorcode)
Schleife zu
}Das ganze als Funktion für den Aufruf von TextBox einbinden, die TextBox soll dann solange weiter machen bis Eingabe o.k..
Geht das, oder geht das nicht? Kann man innerhalb der Windows Applikation überhaupt in C# programmieren oder darf man da nur Windows-Funktionen aufrufen?
Irgendwie ist das gerade im Anfang, für einen alten Konsolenprogrammierer, furchtbar unübersichtlich.
Das Problem mit den float-Eingaben ist ja, wenn eine Standard-Validate den Wert 0 ermittelt, kann das ja trotzdem korrekt sein 0.0 ist ja zulässig.
Gruß Pascal2009
-
Du kannst da drin genauso programmieren wie überall auch. Nutze dafür einfach Regular Expression, dazu solltest du dich mal schlau machen.
-
quick'n'dirty:
void textBox1_TextChanged(object sender, EventArgs e) { double result; if(!double.TryParse(textBox1.Text, out result)) MessageBox.Show("Keine Fließkommazahl."); }
Lässt sich natürlich auch in andere EventHandler einbauen (
Button.Click
z.B.) oder andere Fehlermeldungen etc...
Eventuell musst du noch die richtigeCultureInfo
angeben angeben:void textBox1_TextChanged(object sender, EventArgs e) { double result; if(!double.TryParse(textBox1.Text, NumberStyles.Number, CultureInfo.CurrentCulture, out result)) MessageBox.Show("Keine Fließkommazahl."); }
-
O.o schrieb:
quick'n'dirty:
void textBox1_TextChanged(object sender, EventArgs e) { double result; if(!double.TryParse(textBox1.Text, out result)) MessageBox.Show("Keine Fließkommazahl."); }
Lässt sich natürlich auch in andere EventHandler einbauen (
Button.Click
z.B.) oder andere Fehlermeldungen etc...
Eventuell musst du noch die richtigeCultureInfo
angeben angeben:void textBox1_TextChanged(object sender, EventArgs e) { double result; if(!double.TryParse(textBox1.Text, NumberStyles.Number, CultureInfo.CurrentCulture, out result)) MessageBox.Show("Keine Fließkommazahl."); }
Kurz und knapp, das sieht sehrt gut aus! Verglichen mit den abschreckenden Beispielen im Internet fast schon genial!
Nimmt der Compiler auch!
Nur daß er leider zeichenweise prüft. Ich müßte ihm jetzt noch sagen, wart mal auf die Enter_taste und prüfe dann. Setze ich aber accept Enter in den Eigenschaften von Textbox auf true, kommt er mit Fehlermeldung:
Fehler 1 Datei "obj\Release\WindowsFormsApplication1.exe" kann nicht in "bin\Release\WindowsFormsApplication1.exe" kopiert werden. Der Prozess kann nicht auf die Datei "bin\Release\WindowsFormsApplication1.exe" zugreifen, da sie von einem anderen Prozess verwendet wird. WindowsFormsApplication1
Wir nähern uns der Sache zwar langsam aber sicher an, aber der Weg dahin scheint doch recht steinig zu sein!
Moment es heißt nicht accepts Enter, sondern accepts Return. Scheint wohl nicht dasselbe zu sein.
MfG Pascal
-
O.o schrieb:
Lässt sich natürlich auch in andere EventHandler einbauen (Button.Click z.B.)
void textBox1_KeyDown(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Return || e.KeyCode == Keys.Enter) { double result; if(!double.TryParse(textBox1.Text, NumberStyles.Number, CultureInfo.CurrentCulture, out result)) MessageBox.Show("Keine Fließkommazahl."); } }
Deine Fehlermeldung hat nichts mit
TextBox.AcceptsReturn
zu tun. Sie soll einfach heißen, dass er nichts in die Exe schreiben kann weil sie noch benutzt wird (aka das Programm läuft noch). Schau einfach mal im Taskmanager nach und beende dort den Prozess.
-
Wenn du "Enter" abfangen willst, dann mach das mit einem KeyDown oder KeyUp Event, dort kannst du die KeyEventArgs auf die Enter Taste überprüfen.
-
Das sieht jetzt schon ganz hervorragend aus!
Die Eingabe beginnt rechtsbündig, und schiebt sich beim Eintippen nach links raus, wie das bei Fließkomma ja genau richtig ist, und man kann den Punkt so setzen, wie man will.
Also Text-Vorgabe steht 0.00 drin, die werden aber von rechts kommend überschrieben.
Das ist eine sehr "händige" Eingabe, wie man sie sich besser nicht wünschen kann.
Problem aber: er wartet nicht auf Enter, sondern prüft bei jedem neuen Zeichen die Eingabe, z. B. ein - MInus Zeichen führt zur Fehlermeldung.
Es fehlt also, daß die gesamte Eingabe erst mit Enter gelten soll. Das fehlt jetzt noch.
-
@firefox
KeyEvents finde ich weder in den Eigenschaften von TextBox noch als separates Tool in der Toolbox.
Bitte berücksichtige, daß ich mir dieses Programm vorgesteren spätabends erstmal runtergeladen habe und da gerade mal einige Stunden mit herumwurstele!