在线程里显示对话框,
第一次点击按钮的话正常显示在调用画面的前面
第二次以后对话框就跑到画面后面了。而不在线程里操作的话,每次都显示在前面
这是为什么
有什么解决办法么(必须要用线程为前提)贴出代码 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
PrintDialog print = new PrintDialog();
DialogResult result = print.ShowDialog();
if (result == DialogResult.OK)
{
int i = 0;
}
} private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Over");
} private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync(); }
第一次点击按钮的话正常显示在调用画面的前面
第二次以后对话框就跑到画面后面了。而不在线程里操作的话,每次都显示在前面
这是为什么
有什么解决办法么(必须要用线程为前提)贴出代码 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
PrintDialog print = new PrintDialog();
DialogResult result = print.ShowDialog();
if (result == DialogResult.OK)
{
int i = 0;
}
} private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Over");
} private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync(); }
{
Action action = () =>
{
PrintDialog print = new PrintDialog();
DialogResult result = print.ShowDialog();
if (result == DialogResult.OK)
{
int i = 0;
}
};
this.Invoke(action, null);
}
MessageBox.Show("Over");
MessageBox 没有 Owner,所以它不属于任何一个窗体。。当然到处乱跑。
MessageBox.Show(form, "Over"); // form: 当前窗体。
大概如此。。手边没有什么编程工具与资料。。参数顺序可能有错。
实在是抱歉啊
我的例子不好啊
我真正用的地方是class里Invoke这个方法引用不出来啊。
如果把showdialog处理放在backgroundWorker1_RunWorkerCompleted里
一个是线程的意义没了,另外一个重要的是流程会出现问题(只有按dialog画面的OK按钮后才处理后面问题)。
其实Dialog前面是查数据的处理,也在线程里处理。
dialog后面是打印处理
都需要在线程里处理
1. 查询和打印分开两个部分的线程,查询(Thread1) -> UI Dialog -> 打印(Thread2)
2. 不推荐:你把Form的引用传到类里去