欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET UserControl 通信的具体实现

程序员文章站 2024-03-02 17:48:46
最近在sharepoint2007中用到了webpart通信技术,个人觉得2007版本里面的connectionconsumer和connectionprovider没有2...

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