Windows窗体中发生事件后,继续执行方法

时间:2019-05-31 14:26:13

标签: c# winforms events

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

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

image of windows forms

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

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

1 个答案:

答案 0 :(得分:0)

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

有(显然)更优雅的方法可以这样做,但这应该为您指明正确的方向。请检查语法,我做到了。

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