c# 如何关闭主窗体中用ShowDialog打开的子窗体
c# 怎么关闭主窗体中用ShowDialog打开的子窗体?
我的需求如下图:
我在主窗体中用ShowDialog打开如红框中所示的ProcessBox,然后我想开启一个线程来关闭这个ProcessBox.(类似于等待数据的一个过程)
问题:我在线程中用Close()关闭ProcessBox时报错"执行 CreateHandle() 时无法调用值 Close()"
我的代码如下:
我自定义了一个ProcessBox控件,代码如下:
主窗体代码如下:
请问如何解决这个问题
------解决方案--------------------
ProcessBox在ui线程打开也要在ui线程关闭
我的需求如下图:
我在主窗体中用ShowDialog打开如红框中所示的ProcessBox,然后我想开启一个线程来关闭这个ProcessBox.(类似于等待数据的一个过程)
问题:我在线程中用Close()关闭ProcessBox时报错"执行 CreateHandle() 时无法调用值 Close()"
我的代码如下:
我自定义了一个ProcessBox控件,代码如下:
namespace NewProcessBox
{
public partial class ProcessBox : Form
{
public ProcessBox(bool isAActive, int InnerCircleRadius, int OuterCircleRadius)
{
InitializeComponent();
loadingCircle.Active = true;//loadingCircle就是中间那个不停转的东西,不用管,这是我调用别人的dll生成的
loadingCircle.InnerCircleRadius = 15;//我调用别人的dll设置loadingCircle的内圆半径,不用管
loadingCircle.OuterCircleRadius = 10;//我调用别人的dll设置loadingCircle的内圆半径,不用管
}
private static ProcessBox processBox = new ProcessBox(true,15,10);
public void SetText(string text)
{
label.Text=text;
}
public static ProcessBox getProcessBox()
{
if (processBox == null || processBox.IsDisposed)
processBox = new ProcessBox(true, 15, 10);
return processBox;
}
}
}
主窗体代码如下:
namespace demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//想通过委托的异步调用来关闭ProcessBox
CrossThreadControl hander = new CrossThreadControl(ThreadControl);
hander.BeginInvoke(new AsyncCallback(writeComplete), null);
ProcessBox.getProcessBox().ShowDialog();//点击button1后开启ProcessBox
}
private void writeComplete(IAsyncResult reslut)
{
CrossThreadControl handler = (CrossThreadControl)((AsyncResult)reslut).AsyncDelegate;
handler.EndInvoke(reslut);//执行到此处报错!
}
public void ThreadControl()
{
//....数据查询过程代码....
ProcessBox.getProcessBox().Close();
}
private delegate void CrossThreadControl();
}
}
请问如何解决这个问题
------解决方案--------------------
ProcessBox在ui线程打开也要在ui线程关闭
public void ThreadControl() {
this.BeginInvoke(new EventHandler(delegate
{
ProcessBox.getProcessBox().Close();