子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,怎么做?
在一个程序中,父窗体向子窗体传递参数,然后子窗体根据父窗体传递的参数及时更新显示的数据,子窗体只被实例化一个,怎么做?
------解决方案--------------------这个方法能帮助你
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=”,然后刷新就可以了;