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

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);
        }
posted @ 2008-07-14 13:37  supers  阅读(201)  评论(0)    收藏  举报