ASP.NET UserControl 通信的具体实现
最近在sharepoint2007中用到了webpart通信技术,个人觉得2007版本里面的connectionconsumer和connectionprovider没有2010版本那么好用,于是换了一种思想去实现通信:webpart容器中装一个usercontrol控件,这样只要usercontrol可以通信,就实现了webpart之间通信。
usercontrol是用户自定义控件,我们可以在usercontrol中注入事件,当一个usercontrol触发某种事件,然后通过事件参数来传递数据,让其他usercontrol获得这个事件传递过来的参数,实现通信。
下面简单演示一下两个usercontrol进行通信
创建好一个类,两个usercontrol和一个web页面。
这里分别是myeventagrs.cs,ucprovider.ascx,uccomsumer.ascx,default.aspx。
myeventagrs.cs代码如下:
public delegate void myeventhandle(object sender, myeventagrs args);
public class myeventagrs : eventargs
{
public myeventagrs() { }
public string mymsg { get; set; }
}
public delegate void myeventhandle(object sender, myeventagrs args);
public class myeventagrs : eventargs
{
public myeventagrs() { }
public string mymsg { get; set; }
}
如果想传递其他对象时就只需要修改myeventagrs类的mymsg方法。这里须继承eventargs抽象类,用于存放事件参数值,另外需定义一个委托事件,然后在其他的地方使用。
ucprovider.ascx代码如下:
public partial class ucprovider : system.web.ui.usercontrol
{
public event myeventhandle myhandle;
protected void page_load(object sender, eventargs e)
{
this.dropdownlist1.selectedindexchanged += new eventhandler(dropdownlist1_selectedindexchanged);
}
void dropdownlist1_selectedindexchanged(object sender, eventargs e)
{
myeventagrs myevent = new myeventagrs();
myevent.mymsg = dropdownlist1.selectedvalue;
myhandle(this, myevent);
} }
public partial class ucprovider : system.web.ui.usercontrol
{
public event myeventhandle myhandle;
protected void page_load(object sender, eventargs e)
{
this.dropdownlist1.selectedindexchanged += new eventhandler(dropdownlist1_selectedindexchanged);
}
void dropdownlist1_selectedindexchanged(object sender, eventargs e)
{
myeventagrs myevent = new myeventagrs();
myevent.mymsg = dropdownlist1.selectedvalue;
myhandle(this, myevent);
} }
这里在前台页面中定义了一个dropdownlist,并给dropdownlist绑定了数据源,不再罗列前台页面。我想实现当用户选择dropdownlist的时候将用户选择的dropdownlist的值传递出去,代码里面用myhandle(this, myevent)来初始化事件。
uccomsumer.ascx代码如下:
public partial class uccomsumer : system.web.ui.usercontrol
{
public void initvalue(string msg) {
lb.text = msg;
}
}
public partial class uccomsumer : system.web.ui.usercontrol
{
public void initvalue(string msg) {
lb.text = msg;
}
}
这里赋值的时候也可以用属性来表示,比如:
public string uc1msg
{
get{return this.lb.text;}
set{this.lb.text=value;}
}
public string uc1msg
{
get{return this.lb.text;}
set{this.lb.text=value;}
}
如果用这种方式,在引用usercontrol的时候就更加方便了:
<uc2:ucconsumer runat="server" id="uc2" uc1msg="defalut value" />
<uc2:ucconsumer runat="server" id="uc2" uc1msg="defalut value" />
default.aspx代码如下:
前台页面里面需要注册usercontrol
<%@ register tagprefix="uc1" tagname="ucprovider" src="~/usercontrols/ucprovider.ascx" %>
<%@ register tagprefix="uc2" tagname="ucconsumer" src="~/usercontrols/uccomsumer.ascx" %>
<%@ register tagprefix="uc1" tagname="ucprovider" src="~/usercontrols/ucprovider.ascx" %>
<%@ register tagprefix="uc2" tagname="ucconsumer" src="~/usercontrols/uccomsumer.ascx" %>
再引用
<uc1:ucprovider runat="server" id="uc1" onmyhandle="uc1_myhandle" />
<uc2:ucconsumer runat="server" id="uc2" />
<uc1:ucprovider runat="server" id="uc1" onmyhandle="uc1_myhandle" />
<uc2:ucconsumer runat="server" id="uc2" />
后台页面:
protected void uc1_myhandle(object sender, myeventagrs args)
{
if (args != null)
{
uc2.initvalue(args.mymsg);
}
else
uc2.uc1msg = string.empty;
}
protected void uc1_myhandle(object sender, myeventagrs args)
{
if (args != null)
{
uc2.initvalue(args.mymsg);
}
else
uc2.uc1msg = string.empty;
}
这样就完成了整个过程。default.aspx页面仅仅是一个载体或者是中间介质,所有的操作都是在两个usercontrol之间进行。但是当页面第一次加载的时候,也就是页面加载好过分下拉框没有被点击之前,这里是没有值传递的。