尽管.NET的控件已经很多,但是自定义用户控件给我们提供了更为广阔的开发空间。合理的使用用户控件能给我们的开发带来很多好处和便捷。
但是用户控件和普通的页面又有一些差别,如果使得用户控件与页面以及用户控件之间的通信,可能成为大家使用用户控件一个必须要思考的问题。当然,用户控件的设计的初衷应该是功能相对独立的单元,某一个用户控件完成特定的某种职能,但是在实际的应用中,经常需要这种用户控件之间的通信。
举个例子:我们把上传文件的功能设计为一个用户控件,用户控件定义一切关于上传的文件格式的判断、动作、显示等。在页面调用的时候,我们直接拖入某一个页面,定义其属性。在这里要求,上传上来的文件形成一个文件列表显示出来,这个就需要用户控件和页面之间实现通信。
最简单的方法:用Session将上传文件的值保存下来,然后在页面直接调用Session,当然这样做并非不可,但是会给你更新、清空这个Session而头疼。
当然你可以使用get方法进行页面传值,但是这样的局限性就更大了,一个控件是为了更多代码来使用的,这样有悖于用户控件设计的出发点。
我们可以通过反射解决这个问题,具体的代码实例:
在页面调用用户控件,用户控件的功能完成后,需要更新主页面。
Page nPage = this.Parent.Page;//首先获得用户控件所在的页面对象
Type pType = nPage.GetType();//获得该对象的类型
MethodInfo nMethod = pType.GetMethod("BindData");
//调用该类型下的某种方法,这里只提供了方法名。具体的方法,必须是public的无返回值的。
nMethod.Invoke(nPage, null);触发执行。这样也就让页面重新加载。
//nMethod.Invoke(p, new object[] { "参数1","参数2" });如果有参数
如果是控件之间传值,可以使用下列方法:
UserControl uc = nPage.FindControl("TempletList1") as UserControl;//只是需要转换为用户控件类型
Type pageType = uc.GetType();
MethodInfo nMethod = pageType.GetMethod("BindData");
nMethod.Invoke(uc, null);