在线程中如何打开指定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);