我制作了这个物理计算器,例如我输入加速度和质量,它给了我力量。现在我遇到了两个问题:
1)当前事件是鼠标点击,但我认为在TextChanged事件中弹出答案会更好。问题是,我有大约9个文本框,我不认为我想在每个单独的文本框事件中添加相同的巨大if语句。如何将这大量代码添加到每个文本框中而不必向每个文本框添加事件?
2)我当前的处理方法是检查每个“公式”的每个文本框是否为空。这意味着我有相同的公式重复3次只是因为它的写法不同 例如: F = ma 可写为F / m = a,它接受另一个if语句,直到它填满所有公式。有没有办法让它比现在更简洁?因为现在我必须在每个if语句前面这样做:
else if (!String.IsNullOrEmpty(txtBoxAcc.Text) &&
String.IsNullOrEmpty(txtBoxFg.Text) &&
String.IsNullOrEmpty(txtBoxFn.Text) &&
String.IsNullOrEmpty(txtBoxF.Text) &&
String.IsNullOrEmpty(txtBoxFk.Text) &&
!String.IsNullOrEmpty(txtBoxMass.Text) &&
String.IsNullOrEmpty(txtBoxUk.Text) &&
String.IsNullOrEmpty(txtBoxVi.Text) &&
String.IsNullOrEmpty(txtBoxVf.Text) &&
String.IsNullOrEmpty(txtBoxTime.Text) &&
String.IsNullOrEmpty(txtBoxD.Text) &&
String.IsNullOrEmpty(txtBoxFnet.Text))
答案 0 :(得分:0)
您需要在所有文本框中的TextChanged事件处理程序中注册相同的方法,如下所示:
private void textBox_TextChanged(object sender, EventArgs e)
{
}
txtBoxFg.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxFn.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxF.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxFk.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxMass.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxUk.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxVi.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxVf.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxTime.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxD.TextChanged += new System.EventHandler(this.textBox_TextChanged);
txtBoxFnet.TextChanged += new System.EventHandler(this.textBox_TextChanged);
由于
答案 1 :(得分:0)
1)避免在代码中的不同位置处理类似事件。由于您只处理文本框,因此可以在单个文本更改的事件处理程序中完成所有计算。
只需将其链接到每个未发送文字更改的事件+ =
答案 2 :(得分:0)
定义一个多次使用的事件处理程序:
EventHandler handler = (s, e) => {
var textBox = s as TextBox;
if (textBox == null)
return;
// handle event
};
获取所有文本框的简单方法,除了它不会在容器控件中搜索:
Controls
.OfType<TextBox>()
.ToList()
.ForEach(textBox => textBox.TextChanged += handler);
或者更简单的方法来获取层次结构中的所有控件:
var visited = new HashSet<Control>();
// tricky way to have a recursive lambda
Action<Control, Action<Control>> visitRecursively = null;
visitRecursively = (control, visit) => {
// duplicate control test might be unnecessary
// but avoids infinite recursion or duplicate events
if (visited.Contains(control))
return;
visited.Add(control);
visit(control);
control
.Controls
.Cast<Control>()
.ToList()
.ForEach(subControl => visitRecursively(subControl, visit));
};
Action<Control> addMyHandler = control => {
TextBox textBox = control as TextBox;
if (textBox != null)
textBox.TextChanged += handler;
};
visitRecursively(this, addMyHandler);