首页 > 解决方案 > 一旦在 Windows 窗体中发生事件,继续执行方法

问题描述

我正在开发一个 Windows 窗体应用程序,它的行为方式与控制台非常相似。我尝试实现的功能应该以与 相同的方式工作Console.ReadLine(),使用 Windows 窗体按钮代替用户按 Enter 键。在表单中,有一个显示输出文本的文本框,以及一个用户可以输入信息的文本框(如图所示)。

编辑:我想做的是让应用程序从输入文本框中获取信息,然后在Start()按下“输入”按钮时将该信息分配给函数内的变量。我面临的问题是对同一个函数多次执行此操作,而没有在函数中进一步处理(即在输出文本框中显示不正确的信息)。

windows窗体的图像

据我了解,我需要使用“输入”按钮中的点击事件,但不确定必须“暂停”该功能,直到点击输入按钮。

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
    }
}

标签: c#winformsevents

解决方案


在我看来,您正在尝试模拟以顺序方式执行的控制台行应用程序。正如其他人所指出的,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;
    }                       
}

[显然] 有更优雅的方法可以做到这一点,但这应该为您指明正确的方向。请检查语法,我这样做是出于我的想法。

最后,如果您只有两个用于名称和描述的文本框,这会容易得多... :-)


推荐阅读