您的位置:首页 > 其它

Web User Controls之间的通讯

2009-02-24 21:33 197 查看

delegate,Interface,Web User Controls之间的通讯


C#中的delegate及在Web开发中的应用(Web User Controls之间的通讯):

delegate是什么?委托?托管?代理?如果你学习过C/C++,也许你更愿意把delegate理解成“函数指针”(想起了N年前学习的潭浩强先生的C语言程序设计这本经典的教程)。

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。

通过以下三个步骤可以实现一个delegate:
1. 定义一个delegate对象,
2. 创建一个delegate对象的实例,
3. 使用创建的实例调用方法。

在Web开发中使用delegate:
.NET Web开发中经常会有这种情况,一个 Web Page 有一个或多个 User Control,当一个User Control里的信息发生变化后,其他的 User Control 或者 Web Page 里的控件或信息需要同步更新。这时需要用到delegate来实现这个同步更新的功能。

例子:
在一个Web Page(Default.aspx)上有一个Lable控件和两个User Control:
<asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label><br />
<uc1:UserControlOne id="UserControlOne1" runat="server">
</uc1:UserControlOne><br />
<uc2:UserControlTwo id="UserControlTwo1" runat="server">
</uc2:UserControlTwo></div>

第一个User Control(UserControlOne)中有一个Lable控件:
<asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label>

第二个User Control(UserControlTwo)中有一个Textbox和一个Button
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="btnHello" runat="server" Text="Hello" />

当用户点击UserControlTwo里的Button后,我们希望将UserControlTwo里的TextBox1里的内容显示在UserControlOne和Default.aspx的Lable控件的地方。

首先我们写一个自定义的事件参数类:
public class UserControlEventArgs : EventArgs
{
private string _message;
public string message
{
get { return _message; }
}
public UserControlEventArgs(string message)
{
this._message = message;
}
}

然后在Default.aspx中加入以下函数:
public void OnUserControlEvent(object sender, UserControlEventArgs e)
{
lblMessage.Text = "Main Page: " + e.message;
}
在UserControlOne中加入以下函数:
public void OnUserControlEvent(object sender, UserControlEventArgs e)
{
lblMessage.Text = "User Control 1: " + e.message;
}
这两个函数的作用就是更新Web Page 和 User Control 中的相应内容。
同时我们需要在Default.aspx中的Page_Load函数里加入几行代码:
protected void Page_Load(object sender, EventArgs e)
{
//用 += 操作符添加事件到事件队列中,即给UserControlTwo中的delegate对象的实例赋值。
UserControlTwo1.OnUserControlEvent += new UserControlTwo.UserControlEventHandler(UserControlOne1.OnUserControlEvent);
UserControlTwo1.OnUserControlEvent += new UserControlTwo.UserControlEventHandler(OnUserControlEvent);
}

最后在UserControlTwo中加入如下代码:
//定义一个delegate对象类型,参数必须和Default.aspx及UserControlOne中的OnUserControlEvent函数参数相同。
public delegate void UserControlEventHandler(Object sender, UserControlEventArgs e);
//创建一个delegate对象的实例
public event UserControlEventHandler OnUserControlEvent;

protected void btnHello_Click(object sender, EventArgs e)
{
//如果delegate对象的实例不为null,调用delegate,触发事件
//Default.aspx和UserControlOne中的OnUserControlEvent函数将被调用
if (OnUserControlEvent != null)
OnUserControlEvent(this, new UserControlEventArgs(TextBox1.Text));
}
当然delegate的参数可以是任意类型,不一定非要用自定义的事件参数,你可以简单的使用string作为参数,但要保证delegate的参数和要调用的函数的参数是相同的。

使用Interface进行Web User Controls之间的通讯:
首先定义一个Interface
public interface IUserControl
{
void SetValue(string value);
}

然后在Web Page和User Control中继承并实现这个Interface
//Web Page
public partial class _Default : System.Web.UI.Page, IUserControl
{
public void SetValue(string value)
{
lblMessage2.Text = "Main Page: " + value;
}
}
//User Control One
public partial class UserControlOne : System.Web.UI.UserControl, IUserControl
{
public void SetValue(string value)
{
lblMessage2.Text = "User Control 1: " + value;
}
}

再看一下如何在User Control Two中调用:
protected void btnHello_Click(object sender, EventArgs e)
{
if (OnUserControlEvent != null)
OnUserControlEvent(this, new UserControlEventArgs(TextBox1.Text));

//调用Web Page的SetValue函数
IUserControl uc = (IUserControl)Page;
uc.SetValue(TextBox1.Text);

//调用User Control One的SetValue函数
IUserControl uc1 = (IUserControl)Page.FindControl("UserControlOne1");
uc1.SetValue(TextBox1.Text);
}
==========================
以上两种方式,就是对象内部调用外部的一个方法,将数据传入到外部,然后外部再改版自已的数据
第三个方式,用Response.Redirect()
第四种方式,指定初始化的顺序,然后用中间对象.(可行性??),在page页面使用FindControl可以做到,
也可this.parent.FindControl,利用控件树来做
http://blog.csdn.net/cxzhq2002/archive/2008/01/25/2065238.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: