C#停止程序流程并重置它而不重新启动

时间:2016-07-28 15:58:46

标签: c# winforms button radio-button

我正在编写一个简单的WindowsForm程序,其中包含radiobuttons,按钮和惯用的InputBox。

相关程序逻辑:我点击了groupbox中的一个radiobutons - >启用按钮 - >单击按钮启动自定义输入框,询问1值和是/取消按钮。

|
V

如果单击是按钮 - >继续逻辑流程

如果点击取消按钮 - >出现弹出窗口("您的输入已被取消,是否要退出应用程序?"),带有是/否按钮

    |
    V

如果单击是按钮 - >退出程序

如果没有点击按钮 - >应用相同的逻辑,如同单击重置按钮,这将重置整个程序而不重新启动它< ---------这是我想要实现的(所有相关方法在下面提供)

有什么问题?

当我只需单击“重置”按钮时,它将应用所有需要的操作并停止,等待我的进一步输入。这是我在上面提到的弹出窗口中单击No按钮时想要实现的确切结果。

但事实并非如此。在调试模式期间,单击No按钮后,它会像我想要的那样遍历Reset按钮的整个逻辑, BUT 之后,它进入IF语句(在我的标记中) buttonGetWorkHours_Click方法)。我不想要那个,我希望它在应用Reset按钮的逻辑并等待我的输入(radiobutton / button click)之后停止流程。

我尝试了什么

我在SO中搜索了几个主题并尝试实现了几个建议。这些建议的结果在inputBoxProcedure方法中被注释掉了。另外,我正在寻找similar posts,这会给我一个正确的想法。但是they state没有重装就不可能。基于thread,我考虑实现额外的变量来用于检查重置逻辑是否正在运行,但似乎不必要地复杂。

终极问题:

我看到了一个测试可执行文件,所以我知道这是可能的,不像帖子和帖子说的那样。能否指点我如何处理它?<​​/ p>

相关代码段方法

为了节省每个人的时间,我只会包含与我的问题相关的方法。

private void buttonGetWorkHours_Click(object sender, EventArgs e)
  {
     if (radioButtonJobStatusFull.Checked) 
     {
        inputBoxProcedure("Enter the total hours worked by the full time employee for the week", "40");
     }
     else if (radioButtonJobStatusPart.Checked)
     {
        inputBoxProcedure("Enter the total hours worked by the part time employee for the week", "30");
     }

     //if, else if, else, unrelated to the lines above
     if()    //<----------------the logic goes here after going through the whole Reset button logic
     {}
     else if()
     {}
     else()
     {}
  }

private void buttonReset_Click(object sender, EventArgs e)
  {
      //clear all radiobutton selections
      //set all strings to empty
      //disable several buttons and groupboxes
      //hide several labels
  }

private void inputBoxProcedure(string text, string defaulttext)
  {
     InputBoxResult result = InputBox.Show(text, "Hours Entry", defaulttext, new InputBoxValidatingHandler(inputBox_Validating));
     if (result.OK)
     {
        labelHoursWorked.Text = result.Text.Trim();
     }
     else
     {
        if (MessageBox.Show("Input was cancelled. Do you wish to quit the application?", "Input Cancelled", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
        {
           Close();
        }
        else
        {
           buttonReset_Click(this, new EventArgs());
           //Form fr = new Form();
           //fr.Show();
           //this.Close();
           //Application.Restart();
        }
     }
  }

1 个答案:

答案 0 :(得分:1)

尝试将inputBoxProcedure更改为:

private bool inputBoxProcedure(string text, string defaulttext)
{
    InputBoxResult result = InputBox.Show(text, "Hours Entry", defaulttext, new InputBoxValidatingHandler(inputBox_Validating));
    if (result.OK)
    {
        labelHoursWorked.Text = result.Text.Trim();
    }
    else
    {
        if (MessageBox.Show("Input was cancelled. Do you wish to quit the application?", "Input Cancelled", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
        {
            Close();
        }
        else
        {
            buttonReset_Click(this, new EventArgs());
            //Form fr = new Form();
            //fr.Show();
            //this.Close();
            //Application.Restart();

            return false; // Added
        }
    }

    return true; // Added
}

请注意,返回类型void变为bool,并且添加了两行return

buttonGetWorkHours_Click更改:

if (radioButtonJobStatusFull.Checked)
{
    inputBoxProcedure("Enter the total hours worked by the full time employee for the week", "40");
}
else if (radioButtonJobStatusPart.Checked)
{
    inputBoxProcedure("Enter the total hours worked by the part time employee for the week", "30");
}

分为:

if (radioButtonJobStatusFull.Checked)
{
    if (!inputBoxProcedure("Enter the total hours worked by the full time employee for the week", "40"))
        return;
}
else if (radioButtonJobStatusPart.Checked)
{
    if (!inputBoxProcedure("Enter the total hours worked by the part time employee for the week", "30"))
        return;
}

这样,重置后,功能inputBoxProcedure将返回false。当函数返回false时,函数buttonGetWorkHours_Click将返回,从而阻止进一步的执行。

我希望这会有所帮助。