我正在开发一个Windows窗体应用程序,其行为与控制台非常相似。我尝试实现的功能应以与Console.ReadLine()
相同的方式工作,并使用Windows窗体按钮代替用户按Enter键。在表单中,有一个显示输出文本的文本框,以及一个用户可以向其输入信息的文本框(如图所示)。
编辑:我想做的是让应用程序从输入文本框中获取信息,然后在按下“输入”按钮时将该信息分配给Start()
函数中的变量。我面临的问题是针对同一功能多次执行此操作,而没有在功能中进一步进行此操作(即在输出文本框中显示错误的信息)。
据我了解,我需要使用“输入”按钮中的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
}
}
答案 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;
}
}
有(显然)更优雅的方法可以这样做,但这应该为您指明正确的方向。请检查语法,我做到了。
最后,如果您只有两个用于名称和描述的文本框,这会容易得多...:-)