我在Winform上有两个文本框。我们的想法是在一个方框中输入华氏温度,然后在用户输入时将Celcius显示在另一个方框中,反之亦然。
我使用'离开'文本框的方法,但我试图使用TextChanged方法,以避免必须单击或按下结果的按钮。
我现在遇到的问题是,当处理第一个字符时,焦点移动到第二个框,这会触发TextChanged方法。
我已尝试使用发件人启用if(),但发件人现在是目标框。
有什么想法吗?
private void TB_Fahrenheit_TextChanged(object sender, EventArgs e)
{
float C, F;
if (TB_Fahrenheit.Text != "")
{
if (float.Parse(TB_Fahrenheit.Text) < 1.0F)
{
TB_Fahrenheit.Text = "0" + TB_Fahrenheit.Text;
}
F = float.Parse(TB_Fahrenheit.Text);
C = ((F - 32) * 5) / 9;
TB_Celcius.Text = C.ToString();
}
}
private void TB_Celcius_TextChanged(object sender, EventArgs e)
{
float C, F;
string SentBy = ((TextBox)sender).Name;
MessageBox.Show(SentBy);
return;
if(SentBy != TB_Fahrenheit.Text)
{
if (TB_Celcius.Text != "")
{
if (float.Parse(TB_Celcius.Text) < 1.0F)
{
TB_Celcius.Text = "0" + TB_Celcius.Text;
}
C = float.Parse(TB_Celcius.Text);
F = ((C * 9) / 5) + 32;
TB_Fahrenheit.Text = F.ToString();
}
}
}
private void TB_Celcius_Enter(object sender, EventArgs e)
{
TB_Celcius.Clear();
TB_Fahrenheit.Clear();
}
private void TB_Fahrenheit_Enter(object sender, EventArgs e)
{
TB_Celcius.Clear();
TB_Fahrenheit.Clear();
}
答案 0 :(得分:3)
我会使用布尔检查器。您正在更改具有文本更改事件的文本框的文本。如果当前正在编辑其他框,则需要确保它不执行任何操作。我的例子
private void setSliderValue(int currentAudioSecond)
{
valueFromTimer = true;
//Do Stuff
valueFromTimer = false;
}
然后在滑块控件上更改值时:
private void sliderAudio_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!valueFromTimer)
{
//Do stuff
}
}
我在加载窗口或表单时经常这样做,我填充一个组合框。为了避免将选定的值/索引更改为触发,我必须实现这样的标志。
答案 1 :(得分:2)
我只需在Control.Enter Event和Control.Leave Event订阅和取消订阅该活动。
当你Enter
fahrenheitTextBox时,它会停用你的celsiusTextBox的TextChanged事件。输入celsiusTextBox时会发生相同的情况,您的fahrenheitTextBox.TextChanged事件将被取消订阅,允许您利用正确的事件TextChanged事件来实现您的目标。
除此之外,我不鼓励在GUI中使用数学公式,因为你可能有错,而且很难测试。最好有一个静态Convert
类,并为您提供适当的转换方法。
public static class Convert {
public float ToFahrenheit(float celsius) {
float f = celsius * 9 / 5 + 32;
return f;
}
public float ToCelsius(float fahrenheit) {
float c = (fahrenheit - 32) * 5 / 9;
return c;
}
}
然后你可以编写单元测试。
[TestMethod]
public void ZeroCelsiusShouldConvertTo32Fahrenheit() {
// Given
float expected 32.0;
float celsius = 0.0;
// When
var actual = Convert.ToFahrenheit(celsius);
// Then
Assert.AreEqual(typeof(float), actual);
Assert.AreEqual(expected, actual);
}
答案 2 :(得分:1)
我认为您必须使用Leave事件而不是TextChanged
。因为它是在
通过使用键盘(TAB,SHIFT + TAB等),通过调用Select或SelectNextControl方法或将ContainerControl.ActiveControl属性设置为当前表单来更改焦点。
使用鼠标或调用Focus方法更改焦点时。
答案 3 :(得分:0)
我建议使用KeyPress事件来计算其他TextBox中的值,就像这样,尽管你必须对float.Parse进行一些格式检查,以确保你有一个数值。
private void TB_Fahrenheit_KeyPress(object sender, KeyPressEventArgs e)
{
float C, F;
if (TB_Fahrenheit.Text != "")
{
if (float.Parse(TB_Fahrenheit.Text) < 1.0F)
{
TB_Fahrenheit.Text = "0" + TB_Fahrenheit.Text;
}
F = float.Parse(TB_Fahrenheit.Text);
C = ((F - 32) * 5) / 9;
TB_Celcius.Text = C.ToString();
}
}
private void TB_Celcius_KeyPress(object sender, KeyPressEventArgs e)
{
float C, F;
string SentBy = ((TextBox)sender).Name;
if (TB_Celcius.Text != "")
{
if (float.Parse(TB_Celcius.Text) < 1.0F)
{
TB_Celcius.Text = "0" + TB_Celcius.Text;
}
C = float.Parse(TB_Celcius.Text);
F = ((C * 9) / 5) + 32;
TB_Fahrenheit.Text = F.ToString();
}
}