C# Bei Betätigung des Enter - Taste wird Null ausgegeben

Aydogan61

Cadet 2nd Year
Registriert
Nov. 2013
Beiträge
16
Ich glaube es ist ein Kleinigkeit aber seit 2 Tagen finde ich den Fehler nicht. Wenn ich die Enter - Taste betätige soll der Programm die Rechnung durchführen und die Ergebnis anzeigen aber es wird immer ein Null angezeigt, wenn ich aber den Button betätige rechnet er mir alles korrekt vor. Wieso funktioniert das mit dem Enter - Taste nicht. Könnt ihr mir bitte dabei helfen wo die Helfer ist.

Vielen Dank.

Software VS 2012

Code:
        public void Calculation_Click(object sender, RoutedEventArgs e)
        {
            SetKFactor();
            SetUSKFactor();

            if (Flow_B > Freq_B)
                SetFrequenz();

            if (Freq_B > Flow_B)
                SetDurchfluss();
        }
                    
        public void Enter_Frequenz(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                SetDurchfluss();
                SetKFactor();
                SetUSKFactor();
            }
        }
        
        public void Enter_Flow(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                SetFrequenz();
                SetKFactor();
                SetUSKFactor();
            }
        }

HTML:
<Button x:Name="Calculation" Content="Calculation" Click="Calculation_Click" HorizontalAlignment="Left" Margin="422,305,0,0" VerticalAlignment="Top" Width="250" IsCancel="True" FontWeight="Bold" FontSize="36" Height="76" FontFamily="Arial"/>

        <TextBlock x:Name="Prog__Name" Margin="50,697,512,40" TextWrapping="Wrap" Text="{Binding VSDER}" FontFamily="Times New Roman" FontStyle="Italic" FontWeight="Bold" FontSize="72" Width="480" Foreground="#FFF7F7F7" HorizontalAlignment="Left" VerticalAlignment="Bottom"/>

        <TextBox Name="Fluss" PreviewKeyDown="Enter_Flow" PreviewMouseLeftButtonDown="Mausklick_Flow"  MouseLeftButtonUp="Mausklick_Flow" HorizontalAlignment="Left" Height="30" Margin="150,305,0,0" Text="{Binding Durchfluss}" VerticalAlignment="Top" Width="100" FlowDirection="RightToLeft" FontSize="16" TabIndex="0" Cursor="Pen" FontFamily="Arial" VerticalContentAlignment="Center"/>

        <TextBox Name="Herz" KeyDown="Enter_Frequenz" PreviewMouseLeftButtonDown="Mausklick_Frequenz" MouseLeftButtonUp="Mausklick_Frequenz" HorizontalAlignment="Left" Height="30" Margin="150,351,0,0" Text="{Binding Frequenz}" VerticalAlignment="Top" Width="100" FlowDirection="RightToLeft" FontSize="16" TabIndex="0" Cursor="Pen" FontFamily="Arial" VerticalContentAlignment="Center"/>
 
Um das Event auch auszulösen, muss der Focus auf der jeweiligen Textbox liegen. Wenn das nicht der Fall ist wird auch nichts ausgeführt.

@BTW: Du verwendest 2 unterschiedliche KeyDown Eventhandler. KeyDown und PreviewKeyDown.

Es sollte nur das KeyDown Event verwendet werden. Da PreviewKeyDown üblichweise dazu genutzt wird, um Eingaben an den Eltern/umliegenden Komponenten abzufangen und ggf. zu blocken.
 
Zuletzt bearbeitet:
Den Focus habe ich so gelegt, aber es funktioniert immer nicht.

Code:
        public void Mausklick_Flow(object sender, MouseButtonEventArgs e)
        {
            Fluss.Focus();
            if (IsFocused == false)
            {
                Fluss.Focus();
                Fluss.Clear();
                Herz.Clear();
                Flow_B = 1;
                Freq_B = 0;
            }
        }

        public void Mausklick_Frequenz(object sender, MouseButtonEventArgs e)
        {
            Herz.Focus();
            if (IsFocused == false)
            {
                Herz.Focus();
                Fluss.Clear();
                Herz.Clear();
                Freq_B = 1;
                Flow_B = 0;
            }
        }
 
Zuletzt bearbeitet:
Du hast che_ etwas missverstanden. Klar muss der Fokus auf dem Control liegen, wenn du von diesem das KeyX-Event haben willst. Das sollst du aber nicht im Code festlegen. Wenn du in die Textbox etwas eingibst, dann hat diese automatisch den Fokus.

Das Problem ist, dass du in den Mausklick-Events abfragst, ob das Fenster den Fokus hat ( (this.)IsFocused ). Wenn du vorher den Fokus auf ein anderes Control setzt, ist diese Abfrage natürlich immer false und löscht dir deine Werte.
 
Die if - Bedienungen habe ich rausgeholt und ausprobiert aber es funktioniert nicht. Das eingegebene Wert wird bei Betätigung des Enter -Taste sofort gelöscht.
 
Leerst du die Felder vielleicht in einer der SetFrequenz()-Methoden? Die beiden obigen Methoden beziehen sich ja nur auf Mausklicks.
Benutz' mal den Debugger, dann siehst du was passiert (Rechtsklick -> Haltepunkt einfügen, dann mit F10/F11 durchgehen.
 
Nimm lieber das Focus event und setze dort die Werte, als das MausEvent um den Focus zu setzen. Dieser wird ja automatisch gesetzt beim Mausclick auf die TextBox.
 
Ich habe Zusätzlich ein Button die den selben Funktion hat. Wenn ich auf dem Button Klicke funktioniert es einbahnfrei, nur halt mit dem Enter Taste wird die Wert gelöscht.

Wenn ich erst den Button nutze, nimmt der Enter Taste die werte die ich bei Button Betätigung genutzt habe.

Vielleicht habe ich den TextBox nicht richtig eingestellt, was muss ich dabei achten, reicht es nur KeyDown zu schreiben oder muss man noch andere Eigenschaften einstellen.
 
Zuletzt bearbeitet:
Wie Darlis schon gesagt hat, mal den Debugger verwenden. Ich dem KeyDown Event welches du erstellt hast einen Haltepunkt setzen und dann mal durchgehen und schauen was er falsch macht, bzw wo er den Wert löscht.
 
Den Fehler habe ich gefunden aber warum er diesen Fehler macht weiß ich nicht. Wenn ich ein Wert in den TextBox eingebe, nimmt er den nicht war. Wenn ich das mit Button realisiere mit er den Wert erst wenn ich den Button betätigt habe.

Kann man den TextBox so programmieren, dass er den Wert direkt annimmt, während ich das eintippe.

Ich habe über den AcceptButton gelesen aber ich glaube diese Funktion gibt es nicht bei VS2012 C# WPF oder?
 
Ich glaube ich verstehe gerade, was du da vorhast. Du hast einen Button, der dir entweder den Durchfluss oder Frequenz berechnet, je nachdem, welches Textfeld der Benutzer zuletzt angeklickt hat. So entstehen Programme, bei denen nur der Programmierer weiß, wie sie zu bedienen sind...

Nimm lieber 2 Buttons, einen für Durchfluss, einen für Frequenz. Du bräuchtest dann auch nur ein Textfeld.
Dann kannst du dir den Mist mit den Mausklicks und Fokus sparen.
 
Mit dem Mausklick und Button, das habe ich hinbekommen. Was bei mir nicht so richtig funktioniert ist der Enter-Taste. Ich habe das gedebuggt und das verhalten beobachtet. Wenn ich auf dem Enter-Taste betätige nimmt er den gegebenen Wert überhaupt nicht an. Er entfernt den Wert. Warum er das macht, weiß ich nicht. Ich denke ich muss ein Funktion finden, wo ich mit dem Enter-Taste die eingegebene Wert bestätige, oder den Wert zu den Variable zuweise. Aber wie ich das mache weiß ich noch nicht.


Problem gelöst.

Das Problem war, der Focus. Wenn ich mit dem Maus auf dem TextBox geklickt habe, ist ja der Focus automatisch da, und wenn ich mit dem Enter - Taste betätige während der Focus in der TextBox ist, wird das als ein Mausklick wahrgenommen und die Werte auf null gesetzt. Man muss den Focus nach dem Wert Eingabe aus dem TextBox rausholen. Erst dann arbeitet der Enter-Taste korrekt.

Hat mein drei Tage gekostet aber endlich ist es hinter mir. :-)

Vielen Dank für eure Hilfen.

MfG

Aydogan61
 
Zuletzt bearbeitet:
Zurück
Oben