日期:2014-05-19  浏览次数:21040 次

在线程中如何打开指定Form窗体
因为每个窗体都是独立的,所以想通过线程打开窗体,寻求方法!!

现有A   现有A   B   C   D   E   5个子窗体和S一个主窗体,想实现在S中点击按钮后通过线程打开子窗体,子窗体显示在S主窗体的panel1中。   5个子窗体和S一个主窗体,想实现在S中点击按钮后通过线程打开子窗体,子窗体显示在S主窗体的panel1中。

点击   A   关闭打开的B   C   D   E,同理点击B   关闭打开的A   C   D   E

------解决方案--------------------
帮LZ顶
------解决方案--------------------
应该是隐藏哦 只能显示一个窗体 其他的都隐藏
主窗体 可以通过方法获得子窗体的句丙(类似指针)句丙.属性(方法),主窗体里面写一个循环判断。
------解决方案--------------------
Mark
------解决方案--------------------
写了一个,但比较麻烦...只用了三个窗体,S,A,B..

S窗体下:
//定义一个线程
private Thread thread;

//存储当前已打开窗体的类型
public static Type CurrentFormType = null;

//定义一个委托,用于打开窗体
public delegate void MyInvoke(Type type);

//定义一个方法用于打开窗体
private void OpenForm(Type type)
{
object obj = Activator.CreateInstance(type);
type.InvokeMember( "TopLevel ", BindingFlags.SetProperty, null, obj, new object[] { false });
type.InvokeMember( "Visible ", BindingFlags.SetProperty, null, obj, new object[] { true });
//添加
this.panel1.Controls.Add(obj as Control);
}

//线程方法
private void ThreadProc()
{
MyInvoke mi = new MyInvoke(OpenForm);
this.BeginInvoke(mi, new object[] { CurrentFormType });
}

//打开A窗体
private void button1_Click(object sender, EventArgs e)
{
//先判断当前panel中是否已有窗体
if (CurrentFormType != null)
{
if (!CurrentFormType.Equals(typeof(A)))
{
//假如不是A类型的,先将其关闭
foreach (Control ctl in this.panel1.Controls)
{
Type type = ctl.GetType();
if (type.Equals(CurrentFormType))
{
//将其关闭
type.InvokeMember( "Close ", BindingFlags.InvokeMethod, null, ctl, null);
}
}
}
else return;
}
CurrentFormType = typeof(A);
//启动线程,打开窗体
StartThread();
}
//启动线程
private void StartThread()
{
thread = new Thread(new ThreadStart(ThreadProc));
thread.Start();
}

//打开B
private void button2_Click(object sender, EventArgs e)
{
//先判断当前panel中是否已有窗体
if (CurrentFormType != null)
{
if (!CurrentFormType.Equals(typeof(B)))
{
//假如不是A类型的,先将其关闭
foreach (Control ctl in this.panel1.Controls)
{
Type type = ctl.GetType();
if (type.Equals(CurrentFormType))
{
//将其关闭
type.InvokeMember( "Close ", BindingFlags.InvokeMethod, null, ctl, null);
}
}
}
else return;
}
CurrentFormType = typeof(B);