如果表单上有任何未保存的更改,如何防止用户退出程序?

时间:2019-05-09 18:47:39

标签: c# winforms

我有一个带有几个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语句。我一直在寻找帮助,并且尝试了几天的尝试。

2 个答案:

答案 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;
        }
    }
}