首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,如何做

2012-02-11 
子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,怎么做?在一个程序中,父窗体向子窗体传递参数,

子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,怎么做?
在一个程序中,父窗体向子窗体传递参数,然后子窗体根据父窗体传递的参数及时更新显示的数据,子窗体只被实例化一个,怎么做?

[解决办法]
这个方法能帮助你

http://blog.csdn.net/Knight94/archive/2006/05/17/742324.aspx
[解决办法]
由于在MDI中,子窗体会很多,那么在我以前一篇文章中所提到的方法就有些繁琐了。为了能适应多个子窗体,并对于每个子窗体只保留一个实例,那么我就用一个新的方法来替换,即用反射方法来作处理。



大致代码如下。

首先是通过子窗体类型名来判断是否打开新的子窗体,还是把原有的子窗体进行显示。

using System.Reflection;

/// <summary>

/// Open child window

/// </summary>

/// <param name= "ChildTypeString "> </param>

private void OpenWindow( string ChildTypeString )

{

Form myChild = null;

if( !ContainMDIChild( ChildTypeString ) )

{

// Get current process assembly

Assembly assembly = Assembly.GetExecutingAssembly();



// Create data type using type string

Type typForm = assembly.GetType( ChildTypeString );



// Create object using type 's "InvokeMember " method

Object obj = typForm.InvokeMember(

null,

BindingFlags.DeclaredOnly |

BindingFlags.Public | BindingFlags.NonPublic |

BindingFlags.Instance | BindingFlags.CreateInstance,

null,

null,

null );



// Show child form

if( obj != null )

{

myChild = obj as Form;

myChild.MdiParent = this;

myChild.Show();

myChild.Focus();

}

}

}



/// <summary>

/// Search mdi child form by specific type string

/// </summary>

/// <param name= "ChildTypeString "> </param>

/// <returns> </returns>

private bool ContainMDIChild( string ChildTypeString )

{

Form myMDIChild = null;

foreach(Form f in this.MdiChildren)

{

if( f.GetType().ToString() == ChildTypeString )

{

// found it

myMDIChild = f;

break;

}

}



// Show the exist form

if( myMDIChild != null)

{

myMDIChild.TopMost = true;

myMDIChild.Show();

myMDIChild.Focus();

return true;

}

else

return false;

}



以上两部分就可以对于每个子窗体只创建一个实例。那么调用以上代码就非常简单了。

如:

//Open a mdi child form which type named "MDIChild "

OpenWindow( typeof( MDIChild ).ToString() );


引用自愚翁的Blog
[解决办法]
楼上的主意不错,或者你可以把要传递的参数定义成静态变量,改变之后利用消息通知子窗体;
或者你把子窗体中要显示新参数的的控件什么的设置成public,在父窗体中直接“子窗体实例.控件.text=”,然后刷新就可以了;


不过这样你的子窗体就不能再给出新参数的时候实例化,应该在之前,用的时候判断一下实例化了没有,没有就实例化,否则就用上面的方法“子窗体实例.控件.text=”就可以了
[解决办法]
子窗体建立一个事件响应,如果父窗体更新,只要激发这个事件就可以了,其实就是设计模式中的注册发行模式
[解决办法]
用Singleton ?
[解决办法]
单件模式Singleton
[解决办法]
此问题最好的也是最简单的解决方法就是互斥体
bool isCreated;
//创建一个互斥体,使窗体只能创建一个实例。
Mutex mutex = new Mutex(true, "要创建的窗体名 ", out isCreated);
if (isCreated)
{
Form1 form1 = new Form1();
form1.ShowDialog();
mutex.ReleaseMutex();
}
[解决办法]
UserManage um = null;

if (um == null || um.IsDisposed)
{
um = new UserManage();
um.Show();
}
um.Focus();
um.TopMost = true;

热点排行