Entwickler-Ecke

WinForms - Werte aus Textbox vergleichen


Heddi - Sa 23.02.13 11:08
Titel: Werte aus Textbox vergleichen
Hi,

bin ein absoluter Frischling in der Sprache C#.

Ich habs schon soweit geschafft, das ein Digitalwert (vom µC gesendet) in einer Textbox angezeigt wird.
Jetzt möchte ich den in einer 2ten Textbox eingetragenen Wert mit dem Digitalwert vergleichen.
Wenn der Digitalwert maximal +/- 0,5% vom eingegebenen Wert abweicht soll sich die Textbox grün färben,
andernfalls rot.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text == txbRaw.Text)
            {
                txbRaw.BackColor = System.Drawing.Color.Green;
            }
            else
            {
                txbRaw.BackColor = System.Drawing.Color.Red;
            }


Selbst wenn der Wert gleich ist färbt sich die Textbox nicht grün

ich hoffe Ihr könnt mir helfen.


Th69 - Sa 23.02.13 11:35

Hallo und :welcome:

bei Textvergleichen muß exakt jedes Zeichen übereinstimmen (auch Leerzeichen o.ä. zählen dazu).
Da du aber mit Zahlenwerten rechnen willst, solltest du mal nach der statischen Methode TryParse suchen (es gibt dazu einige Beispiel hier im Forum). Je nachdem welchen Datentyp du benutzt, also int, double oder decimal, z.B. int.TryParse(...) (oder auch als .NET-Klasse Int32.TryParse(...)).

Und um den Absolutwert zu vergleichen kannst du die statische Methode Math.Abs benutzen (damit du nicht zwei Abfragen für + und - machen mußt).


Heddi - Sa 23.02.13 17:06

Schonmal vielen Dank :zustimm:
Habe das ganze wie folgt gelöst:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string soll = textBox1.Text;
            string ist = txbRaw.Text;
            int istint;
            int sollint;
            bool parsed = Int32.TryParse(soll, out sollint);
            bool parsed2 = Int32.TryParse(ist, out istint);

            if (sollint <= istint*1.5 && sollint >= istint*0.5)
            {
                txbRaw.BackColor = System.Drawing.Color.Green;
            }
            else
            {
                txbRaw.BackColor = System.Drawing.Color.Red;
            }
        }

    }

}


Soweit klappts auch, nur das ich den Wert bei jeder Abfrage neu eingeben muss.
Das Programm soll aber sobald sich der Digitalwert (0-1023) ändert vergleichen.
soll = der Wert der per Hand eingetragen wird.
ist = der Digitalwert


Th69 - So 24.02.13 11:08

Hallo Heddi,

dann mußt du auch für die andere TextBox das TextChanged-Ereignis abonnieren:

C#-Quelltext
1:
txbRaw.TextChanged += textBox1_TextChanged;                    

(entweder im Konstruktor aufrufen oder aber im Designer für txbRaw bei der Eigenschaft 'TextChanged' die Liste aufklappen und 'textBox1_TextChanged' auswählen).

So wird bei jeder Änderung (egal in welcher TextBox) deine Methode aufgerufen.


Heddi - So 24.02.13 12:49

Hallo Th69,

vielen Dank für dein Hilfe :)

So sieht der Quelltext nun aus und funktioniert ohne Probleme:

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:
24:
        private void txbRaw_TextChanged(object sender, EventArgs e)
        {
            txbRaw.TextChanged += textBox1_TextChanged;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string soll = textBox1.Text;
            string ist = txbRaw.Text;
            int istint;
            int sollint;
            bool parsed = Int32.TryParse(soll, out sollint);
            bool parsed2 = Int32.TryParse(ist, out istint);

                if (sollint <= istint * 1.5 && sollint >= istint * 0.5)
                {
                    txbRaw.BackColor = System.Drawing.Color.Green;
                }
                else
                {
                    txbRaw.BackColor = System.Drawing.Color.Red;
                }
            
        }


Th69 - So 24.02.13 13:34

Hallo Heddi,

das hast du wohl falsch verstanden.
Den Code solltest du im Konstruktor deiner Form aufrufen. So wie du es jetzt hast, wird jedesmal das Ereignis abonniert und das bedeutet, daß deine Ereignis-Methode dann mehrmals ausgeführt werden würde (also irgendwann sehr langsam wird...).


Heddi - So 24.02.13 15:01

Hallo Th69,

meinst du das so? :


C#-Quelltext
1:
2:
3:
4:
        public txbRaw1()
        {
            txbRaw.TextChanged += textBox1_TextChanged;
        }



C#-Quelltext
1:
2:
3:
4:
        private void txbRaw_TextChanged(object sender, EventArgs e)
        {
            txbRaw1();
        }


Th69 - So 24.02.13 15:10

Hallo Heddi,

nein, im Konstruktor, also in

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public partial class MyForm : Form
{
        public MyForm()
        {
            InitializeComponent();

            txbRaw.TextChanged += textBox1_TextChanged;
        }
}

(oder wie auch immer deine Form-Klasse heißt ;-))


Heddi - So 24.02.13 18:45

Hallo Th69,

ach so war das gemeint. Da hat sich wohl ein Denkfehler eingeschlichen :D.

Vielen Dank für deine Hilfe :zustimm: :zustimm: