C#停止程序流,并在不重新启动的情况下将其重置
本文关键字:情况下 重新启动 程序 | 更新日期: 2023-09-27 17:59:09
我正在编写一个简单的WindowsForm程序,其中包含单选按钮、按钮和一个习惯实现的InputBox。
相关程序逻辑:我单击组框中的一个单选按钮->启用按钮->单击按钮启动自定义输入框,要求输入1个值和是/取消按钮。
|
V
如果点击"是"按钮->继续进行逻辑流程
如果单击取消按钮->弹出窗口("您的输入已取消,您想退出应用程序吗?"),并显示是/否按钮
|
V
如果点击"是"按钮->退出程序
如果单击"否"按钮->应用与单击"重置"按钮相同的逻辑,这将重置整个程序而不重新启动<---------这就是我正在努力实现的(下面提供了所有相关方法)
问题出在哪里
当我简单地单击"重置"按钮时,它会应用所有需要的操作并停止,等待我的进一步输入。这正是我在上面提到的弹出窗口中单击"否"按钮时试图实现的结果。
然而,事实并非如此。在调试模式中,单击"否"按钮后,它会像我想要的那样遍历"重置"按钮的整个逻辑,但之后,它会进入IF语句(标记在我的按钮GetWorkHours_Click方法中)。我不希望这样,我希望它在应用重置按钮的逻辑并等待我的输入(单选按钮/按钮点击)后停止流。
我尝试了什么
我在SO中搜索了几个线程,并尝试实现几个建议。这些建议的结果在inputBoxProcedure方法中进行了注释。此外,我正在寻找类似的帖子,这会给我正确的想法。但他们表示,不重新加载是不可能的。基于该线程,我考虑实现额外的变量来检查重置逻辑是否正在运行,但似乎不必要地复杂。
最终问题:
我看到了一个测试可执行文件,所以我知道这是可能的,不像帖子和线程所说的那样。你能告诉我如何进行这项工作的正确方向吗?
相关代码段方法
为了节省大家的时间,我将只包括与我的问题相关的方法。
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();
}
}
}
尝试将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
将返回,从而防止进一步的执行。
我希望这能有所帮助。