我有一个带有几个numericUpDown控件的Winforms,我希望程序在用户单击表单上的退出按钮,是否有未保存的更改以及是否没有未保存的更改继续时警告用户。我有“保存”按钮单击事件,可以在每次保存后将所有NUD控件重置为0。
我尝试了几种方法之一,其中所有的numericUpDown控件值都汇总并显示在文本框中,然后将文本框放入if语句中,并在文本框texchanged然后触发消息框时触发消息框用户有关未保存的更改,如果文本框为null,则退出。
但是,单击保存按钮甚至清除所有控件后,文本框的默认值为0,因为它是从numericUpDown控件获取该值的。因此,当我单击退出按钮时,它告诉我我尚未保存的值为0的更改。那不是我想要的所以我尝试了一些不同的东西。如果我仅在if语句中包含一个NUD控件,则它可以正常工作,但是我要包含多个控件,而当我添加其余NUD控件时,它将不起作用。就像我的代码所示。我对C#还是很陌生,所以被卡住了。这是我现在的代码。
private void btnExit2_Click(object sender, EventArgs e)
{
if (numericUpDown1RB1Rep.Value <= 0 || numericUpDown1RB2Rep.Value <= 0 || numericUpDown1RB3Rep.Value <= 0 || numericUpDown1RB4Rep.Value <= 0)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit this application?", "Exit",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{
Application.Exit();
}
else if (dialogResult == DialogResult.No)
{
return;
}
}
if (numericUpDown1RB1Rep.Value > 0 || numericUpDown1RB2Rep.Value > 0 || numericUpDown1RB3Rep.Value > 0 || numericUpDown1RB4Rep.Value > 0)
{
DialogResult dialog = MessageBox.Show("You have unsaved changes. Please save before closing this application", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
if (dialog == DialogResult.OK)
{
return;
}
我想要一种方法或解决方案,无需将所有numericUpDown控件添加到此if语句中,并且可能使它看起来有些优雅。或者,也许根本不必使用if语句。我一直在寻找帮助,并且尝试了几天的尝试。
答案 0 :(得分:0)
如果仅当所有numericUpDown都为零或更少时才允许退出而不保存,则需要更改测试条件并使用&&代替||
if (numericUpDown1RB1Rep.Value <= 0 &&
numericUpDown1RB2Rep.Value <= 0 &&
numericUpDown1RB3Rep.Value <= 0 &&
numericUpDown1RB4Rep.Value <= 0)
{
// Exit block
}
else
{
// Save block
}
请注意,在这种情况下,您不需要单独保存,因为如果条件为假,显然您需要保存。
如评论中指出的那样,使用一系列控件将使生活更轻松
public class Form1 : Form
{
// At the form class level
NumericUpDown[] numCtrls = new NumericUpDown[]
{
numericUpDown1RB1Rep, numericUpDown1RB2Rep,
numericUpDown1RB3Rep, numericUpDown1RB4Rep
};
public Form1()
{
InitializeComponent();
}
... other form's methods or events.....
}
以及点击事件中
if(numCtrls.All(x => x.Value <= 0))
// Exit block
else
// Save block
答案 1 :(得分:0)
如果您的问题是手动添加NumericUpDown,则可以枚举控件:
private IEnumerable<NumericUpDown> GetNumericUpDowns(Control parent)
{
for (int i = parent.Controls.Count - 1; i <= 0; i--)
{
if (parent.Controls[i] is NumericUpDown)
yield return (NumericUpDown)parent.Controls[i];
}
}
private void btnExit2_Click(object sender, EventArgs e)
{
var upDowns = GetNumericUpDowns(this).ToList();
if (upDowns.Any(a => a.Value <= 0))
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit this application?", "Exit",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{
Application.Exit();
}
else if (dialogResult == DialogResult.No)
{
return;
}
}
if (upDowns.Any(a => a.Value > 0))
{
DialogResult dialog = MessageBox.Show(
"You have unsaved changes. Please save before closing this application", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
if (dialog == DialogResult.OK)
{
return;
}
}
}
,如果您不想检查所有NumericUpDown控件,则可以在要检查的控件中添加标签(例如1),并且仅检查具有此标签的控件:
private IEnumerable<NumericUpDown> GetNumericUpDowns(Control parent)
{
for (int i = parent.Controls.Count - 1; i <= 0; i--)
{
if (parent.Controls[i] is NumericUpDown)
{
var upDown = (NumericUpDown) parent.Controls[i];
if ((int)upDown.Tag == 1)
yield return upDown;
}
}
}