c# - 一旦在 Windows 窗体中发生事件,继续执行方法
问题描述
我正在开发一个 Windows 窗体应用程序,它的行为方式与控制台非常相似。我尝试实现的功能应该以与 相同的方式工作Console.ReadLine()
,使用 Windows 窗体按钮代替用户按 Enter 键。在表单中,有一个显示输出文本的文本框,以及一个用户可以输入信息的文本框(如图所示)。
编辑:我想做的是让应用程序从输入文本框中获取信息,然后在Start()
按下“输入”按钮时将该信息分配给函数内的变量。我面临的问题是对同一个函数多次执行此操作,而没有在函数中进一步处理(即在输出文本框中显示不正确的信息)。
据我了解,我需要使用“输入”按钮中的点击事件,但不确定必须“暂停”该功能,直到点击输入按钮。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void TextTop_Changed(object sender, EventArgs e)
{
}
private void Enter_Clicked(object sender, EventArgs e)
{
textBottom.Text = string.Empty;
}
private void Start_Click(object sender, EventArgs e)
{
start();
}
public void textBoxInput(string message)
{
textTop.Text = message;
}
public void start()
{
textBottom.Text = "Enter name:";
//need to wait here until enter button is clicked.
string name = textTop.Text;//get input from top text box
textBottom.Text = "Enter description:";
//need to wait here until enter button is clicked again.
string description = textTop.Text; //get input from top text box
}
}
解决方案
在我看来,您正在尝试模拟以顺序方式执行的控制台行应用程序。正如其他人所指出的,Windows 窗体不能按顺序工作。而是触发事件。
我相信您需要做的是在内部保持运营状态。为此目的,有一组具有表单范围的变量:
public class Form1 : Form
{
public const int STEP_INITIAL = 0;
public const int STEP_GET_NAME = 1;
public const int STEP_GET_DESCRIPTION = 2;
public const int STEP_INFO_GATHERED = 3;
private int _step = STEP_INITIAL;
private string _name;
private string _description;
}
然后,您的Start
方法可以检查当前状态并执行它需要执行的操作:
public void start()
{
switch (_step)
{
case STEP_INITIAL:
textBottom.Text = "Enter name:";
_step = STEP_GET_NAME;
break;
case STEP_GET_NAME:
_name = textTop.Text;
if (string.IsNullOrWhiteSpace(_name))
MessageBox.Show("Please enter a valid name!");
else
{
textBottom.Text = "Enter description:";
textTop.Clear();
_step = STEP_GET_DESCRIPTION;
}
break;
case STEP_GET_DESCRIPTION:
_description = textTop.Text;
if (string.IsNullOrWhiteSpace(_description))
MessageBox.Show("Please enter a valid description!");
else
{
//This is your final state, where they have entered all the information
_step = STEP_INFO_GATHERED;
}
break;
}
}
[显然] 有更优雅的方法可以做到这一点,但这应该为您指明正确的方向。请检查语法,我这样做是出于我的想法。
最后,如果您只有两个用于名称和描述的文本框,这会容易得多... :-)
推荐阅读
- python - Python当它们都在体内时如何对值进行排序?
- javascript - 如何从量角器测试中的下一页获取数据?
- python - TypeError:字符串格式化期间并非所有参数都转换 - pymysql
- spring - Pivotal Cloud Foundry 上的 Spring Cloud Config Server
- go - 通过通道发送的值不会被视为已接收
- mysql - 仅获取多对多关系上最近日期的结果
- c++ - 如何为vs代码安装vcpkg?
- sql - 如何在 MSSQL 中进行从 xml 到动态表和列的合并操作
- reactjs - Apollo Client 3 驱逐查询结果 - 不起作用?
- node.js - 加快nodejs中的多个等待调用