我有两个名为 mainForm 和 helperForm 的表单。在mainForm上我有一个按钮,在helperForm上我有一个richTextBox。我想做的是;一旦单击mainForm上的按钮,我想显示helperForm,以及richtextbox上的一些文本。使用下面的代码,我可以看到帮助器表单,但按钮完成后面的所有进程都在 buttonClick 事件中...
的MainForm
public partial class Form : Form
{
public HelperForm helperForm;
public MainForm()
{
InitializeComponent();
}
public void button_Click(object sender, EventArgs e)
{
helperForm= new HelperForm ();
helperForm.Show();
helperForm.richTextBox1.AppendText("Program started");
//doing process1
helperForm.richTextBox1.AppendText("Program start to check process1");
//doing process2
helperForm.richTextBox1.AppendText("Program start to check process2");
//doing process3
helperForm.richTextBox1.AppendText("Program start to check process3");
//doing process2
helperForm.richTextBox1.AppendText("All the process are done!");
helperForm.Close();
}
答案 0 :(得分:0)
试试这个;
public void button_Click(object sender, EventArgs e)
{
helperForm= new HelperForm ();
Timer countdown=new Timer();
countdown.Interval=1000;//1000 Milliseconds
countdown.Tick+=CountDownTickEvent;
switch(condition to check which text to append):
{
case 1:
helperForm.richTextBox1.AppendText("Program started");
break;
case 2:
//doing process1
helperForm.richTextBox1.AppendText("Program start to check process1");
break;
case 3:
//doing process2
helperForm.richTextBox1.AppendText("Program start to check process2");
break;
case 4:
//doing process3
helperForm.richTextBox1.AppendText("Program start to check process3");
break;
case 5:
//doing process2
helperForm.richTextBox1.AppendText("All the process are done!");
break;
}
helperForm.Show();
}
你正在无模式地显示一个表单,这意味着这个不会阻止调用者线程,因此没有理由在Form.Close()
之后调用Form.Show()
6个语句,这没有意义,这只是显示flash的表单,然后表单消失。如果您需要在指定的时间内显示表单,请更好地使用Timer
。
修改:要在指定的时间内显示表单,请使用以下函数;
int counter=0;
public void button_Click(object sender, EventArgs e)
{
helperForm= new HelperForm ();
Timer countdown=new Timer();//New instance of Timer class.
countdown.Interval=1000;//1000 Milliseconds,change as needed.
countdown.Tick+=CountDownTickEvent;//Event handler for tick event of Timer.
//Same as above.
helperForm.Show();
countdown.Start();//Start the timer.
}
然后创建CountDownTickEvent
,如下所示;
private void CountDownTickEvent(object sender, EventArgs e)
{
counter++;
if (counter == 5)//5 seconds have been passed since the timer is running.Change as needed.
{
helperForm.Close();//Displayed for 5 seconds,form should close now.
counter=0;
}
}
嗯,这会给你一个带有文本的 helperForm 5秒,然后它会自动关闭。
答案 1 :(得分:0)
正确的解决方案是使用后台线程来实现“进度条”类型的显示,这可以防止锁定UI。在从后台线程命令UI操作时,您需要调用这些操作以防止异常 - 不允许直接从后台线程更新UI。
以下代码可以满足您的需求,但您需要阅读线程,调用和委托,否则这没有任何意义。如果我们可以看到更多的代码,那么可能有一种方法可以使用Application.DoEvents(),但这在循环中更合适,它提供了重复命令的好地方。除非我把一个小实用程序放在一起,否则我仍然更喜欢后台线程。
public partial class Form1 : Form
{
private HelperForm helperForm;
private Thread processRunner;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (processRunner == null || processRunner.ThreadState == ThreadState.Stopped)
{
helperForm = new HelperForm();
helperForm.Show();
processRunner = new Thread(new ThreadStart(runProcesses));
processRunner.Start();
}
}
private void runProcesses()
{
this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program started"); }));
//represents process1
Thread.Sleep(2000);
this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program start to check process1"); }));
//represents process2
Thread.Sleep(2000);
this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program start to check process2"); }));
//represents process3
Thread.Sleep(2000);
this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program start to check process3"); }));
//represents process4
Thread.Sleep(2000);
this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("All the process are done!"); }));
// to let the message display
Thread.Sleep(2000);
helperForm.Invoke(new Action(() => { helperForm.Close(); }));
}
}