我有method
SUM
个textboxes
个textboxes
,我想改进它,所以如果这些empty
中的任何一个是"0"
,我希望插入void vypocti_naklady()
{
double a, b,c,d,e,f,g,h;
if (
!double.TryParse(p_ub_s.Text, out a) ||
!double.TryParse(p_poj_s.Text, out b) ||
!double.TryParse(p_jin_s.Text, out c) ||
!double.TryParse(p_dop_s.Text, out d) ||
!double.TryParse(p_prov_s.Text, out e) ||
!double.TryParse(p_pruv_s.Text, out f) ||
!double.TryParse(p_rez_s.Text, out g) ||
!double.TryParse(p_ost_s.Text, out h)
)
{
naklady.Text = "0";
return;
}
naklady.Text = (a+b+c+d+e+f+g+h).ToString();
}
,但我不知道在哪里以及究竟是什么让它像我想要的那样工作。我很长时间都在想这件事,有人会建议我吗?
{{1}}
感谢大家的帮助和时间。
答案 0 :(得分:4)
您可以创建一个经文本框验证的事件(因为如果为空,您只需要插入0而不保留焦点),并将所有其他文本框订阅到该文本框验证事件。
例如:您有5个文本框订阅(通过单击例如textbox1属性窗口|事件并双击验证),并且对于其他文本框,将其验证的事件订阅到该文本框,然后在其中放置:
private void textBox1_Validated(object sender, EventArgs e)
{
if (((TextBox)sender).Text == "")
{
((TextBox)sender).Text = "0";
}
}
答案 1 :(得分:1)
private double GetValue(string input)
{
double val;
if(!double.TryParse(input,out val))
{
return val;
}
return 0;
}
var sum = this.Controls.OfType<TextBox>().Sum(t => GetValue(t.Text));
尝试以上方法。只需在文本框的父级上运行OfType(父级可以是表单本身)
这会将任何无效输入计为0
答案 2 :(得分:1)
试试这个:
// On the textboxes you want to monitor, attach to the "LostFocus" event.
textBox.LostFocus += textBox_LostFocus;
它监视TextBox何时失去焦点(已被点击离开)。如果有,则运行以下代码:
static void textBox_LostFocus(object sender, EventArgs e) {
TextBox theTextBoxThatLostFocus = (TextBox)sender;
// If the textbox is empty, zeroize it.
if (String.IsNullOrEmpty(theTextBoxThatLostFocus.Text)) {
theTextBoxThatLostFocus.Text = "0";
}
}
如果有效,则会观看TextBox.LostFocus
事件。然后,当用户点击该框时,它将运行textBox_LostFocus
。如果TextBox
为空,则我们将该值替换为零。
答案 3 :(得分:1)
另一种方法是不直接使用TextBox
文本并解析它,而是将数据绑定到属性并使用它们。 Binding
本身将进行解析和验证,使您的变量始终保持清洁并可以使用。
public partial class Form1 : Form
{
// Declare a couple of properties for receiving the numbers
public double ub_s { get; set; }
public double poj_s { get; set; } // I'll cut all other fields for simplicity
public Form1()
{
InitializeComponent();
// Bind each TextBox with its backing variable
this.p_ub_s.DataBindings.Add("Text", this, "ub_s");
this.p_poj_s.DataBindings.Add("Text", this, "poj_s");
}
// Here comes your code, with a little modification
private void vypocti_naklady()
{
if (this.ub_s == 0 || this.poj_s == 0 /*.......*/)
{
naklady.Text = "0";
return;
}
naklady.Text = (this.ub_s + this.poj_s).ToString();
}
}
您只需使用已安全输入double
的属性,而忘记格式化和解析。您可以通过将所有数据移动到ViewModel
类并将逻辑放在那里来改进这一点。理想情况下,您也可以通过数据绑定将相同的想法应用于输出TextBox
,但为了实现这一点,您必须实现INotifyPropertyChanged
,以便绑定知道何时更新UI。