ASP.NET UserControl 通信

6次阅读

最近在 SharePoint2007 中用到了 WebPart 通信技术,个人觉得 2007 版本里面的 ConnectionConsumer 和 ConnectionProvider 没有 2010 版本那么好用,于是换了一种思想去实现通信:WebPart 容器中装一个 UserControl 控件,这样只要 UserControl 可以通信,就实现了 WebPart 之间通信。下面我就用 ASP.NET 的 UserControl 模拟 SharePoint UserControl 通信,两者的本质,思想和实现方式都不变。
UserControl 是用户自定义控件,我们可以在 UserControl 中注入事件, 当一个 UserControl 触发某种事件,然后通过事件参数来传递数据,让其他 UserControl 获得这个事件传递过来的参数,实现通信。
下面简单演示一下两个 UserControl 进行通信
创建好一个类,两个 UserControl 和一个 web 页面。
这里分别是 MyEventAgrs.cs,UCProvider.ascx,UCComsumer.ascx,Default.aspx。
MyEventAgrs.cs 代码如下:
[csharp] 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 代码如下:
[csharp] 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 代码如下:
[csharp] 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;
}
}
这里赋值的时候也可以用属性来表示,比如:
[csharp] 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 的时候就更加方便了:
[csharp]
Default.aspx 代码如下:
前台页面里面需要注册 UserControl
[csharp] <%@ 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" %>
再引用
[javascript]



后台页面:
[csharp] 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 之间进行。但是当页面第一次加载的时候,也就是页面加载好过分下拉框没有被点击之前,这里是没有值传递的。

正文完