none
如何触发用户控件事件???? RRS feed

  • 问题

  • 我在用户控件中DropDownList2中写了 DropDownList2_SelectedIndexChanged事件,但是调用用户控件时怎么补会触发 DropDownList2_SelectedIndexChanged事件??????????

    2009年8月26日 5:40

答案

  • 用户控件代码
    public partial class WebUserControl : System.Web.UI.UserControl
    
    {
        public event EventHandler d;
        public bool a
        {
          get
            {
              return  DropDownList1.AutoPostBack;
        
          }
            set
            {
                DropDownList1.AutoPostBack = value;
            }
        }
        public string s
        {
            get
            {
                return DropDownList1.SelectedValue;
            }
    
        }
    
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            d(sender, e);
        }
    }
    用户控件
    
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
    <asp:DropDownList ID="DropDownList1" runat="server" 
        onselectedindexchanged="DropDownList1_SelectedIndexChanged">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>2</asp:ListItem>
    </asp:DropDownList>
    
    
    aspx页面代码
    public partial class Default5 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            WebUserControl1.a = true;
            WebUserControl1.d += new EventHandler(WebUserControl1_d);
        }
    
        void WebUserControl1_d(object sender, EventArgs e)
        {
            Response.Write(WebUserControl1.s);
        }
    }
    aspx页
    
        <uc1:WebUserControl ID="WebUserControl1" runat="server" />
    • 已建议为答案 mldark 2009年8月26日 8:20
    • 已标记为答案 ysyy 2009年8月28日 3:34
    2009年8月26日 7:43

全部回复

  • 贴你的DropDownList2控件代码和你的使用页面代码
    【孟子E章】
    2009年8月26日 5:45
    版主
  • AutoPostBack 要设为 true, 要启用 ViewState
    知识改变命运,奋斗成就人生!
    2009年8月26日 5:46
    版主
  • 你好AutoPostBack 要设置为True
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月26日 5:47
    版主
  • 你好AutoPostBack 要设置为True
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    已经设置了得哈
    2009年8月26日 5:49
  • 已经设置了得哈
    2009年8月26日 5:50
  • 已经设置了AutoPostBack 为 true,ViewState如何启用??
    2009年8月26日 5:58
  • 你可以帖出你控件的代码及引用页面的代码
    知识改变命运,奋斗成就人生!
    2009年8月26日 6:00
    版主
  • 和ViewState应该没有关系

    启用
    <@Page EnableViewState  = "true" %>

    【孟子E章】
    2009年8月26日 6:04
    版主
  • 动态创建的控件,你需要

    DropDownList2.SelectedIndexChanged += new System.EventHandler(this DropDownList2_SelectedIndexChanged); 

    【孟子E章】
    2009年8月26日 6:08
    版主
  • 使用的是这个http://www.cnblogs.com/xbf321/archive/2008/08/01/Dynamic-load-control-in-asp-net.html里面介绍的方法,就是怎么都不行
    2009年8月26日 6:09
  • ????
    2009年8月26日 6:25
  • 那只是个人的做法,你可以去那个文章下面发表疑问。
    【孟子E章】
    2009年8月26日 6:47
    版主
  • 你好,楼主,请帖出你的代码。
    jon.valett@gmail.com
    2009年8月26日 6:53
    版主
    • 已建议为答案 mldark 2009年8月26日 7:40
    • 取消建议作为答案 孟宪会Moderator 2009年8月26日 8:22
    • 已标记为答案 ysyy 2009年8月28日 3:34
    • 取消答案标记 ysyy 2009年8月28日 3:34
    2009年8月26日 6:55
  • 用户控件代码
    public partial class WebUserControl : System.Web.UI.UserControl
    
    {
        public event EventHandler d;
        public bool a
        {
          get
            {
              return  DropDownList1.AutoPostBack;
        
          }
            set
            {
                DropDownList1.AutoPostBack = value;
            }
        }
        public string s
        {
            get
            {
                return DropDownList1.SelectedValue;
            }
    
        }
    
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            d(sender, e);
        }
    }
    用户控件
    
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
    <asp:DropDownList ID="DropDownList1" runat="server" 
        onselectedindexchanged="DropDownList1_SelectedIndexChanged">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>2</asp:ListItem>
    </asp:DropDownList>
    
    
    aspx页面代码
    public partial class Default5 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            WebUserControl1.a = true;
            WebUserControl1.d += new EventHandler(WebUserControl1_d);
        }
    
        void WebUserControl1_d(object sender, EventArgs e)
        {
            Response.Write(WebUserControl1.s);
        }
    }
    aspx页
    
        <uc1:WebUserControl ID="WebUserControl1" runat="server" />
    • 已建议为答案 mldark 2009年8月26日 8:20
    • 已标记为答案 ysyy 2009年8月28日 3:34
    2009年8月26日 7:43
  • 我使用的是这个http://www.cnblogs.com/xbf321/archive/2008/08/01/Dynamic-load-control-in-asp-net.html里面介绍的方法

    我点错了建议为答案 不好意思
    2009年8月26日 7:44
  • 呵呵,好
    2009年8月26日 8:18
  • ?????
    2009年8月26日 9:38
  • 呵呵

    2009年8月27日 1:55
  • 你好,这个视图状态没有保持下来的问题,你动态加载控件的代码不要写到 if (!IsPostBack) 中
    知识改变命运,奋斗成就人生!
    2009年8月27日 2:33
    版主
  • 呵呵,没有写到 if (!IsPostBack) 中哈

    2009年8月27日 3:08
  • 啊!!!!
    2009年8月27日 5:04
  • 你如果想解决的话 你直接贴出代码来
    2009年8月27日 5:06
  • 用户控件代码:
          protected void DropDownList1_SelectedIndexChanged1(object sender, EventArgs e)
            {
                int a = 0;
            }

    BasePage类:
      public class BasePage : Page
        {
            // SESSION_CONTAINERS_KEY将被用做Session 的值来保存
            private const string SESSION_CONTAINERS_KEY = "Controls_In_Container";

            //PATH_TO_CONTROL则定义了您的程序所要载入用户控件的虚拟路径
            private const string PATH_TO_CONTROL = "~/App_Controls/{0}";
            #region 添加数据字典属性
            //把添加到页面上所有用户控件的每一个PlaceHolder放到一个字典中,页面上所有的PlaceHoder都有一个数据字典,并且每一个PlaceHolder都有一个用户控件集合的数据字典。
            protected Dictionary<string, Dictionary<string, UserControl>> Container
            {
                get
                {
                    Dictionary<string, Dictionary<string, UserControl>> containers =
                        new Dictionary<string, Dictionary<string, UserControl>>();
                    if (Session[SESSION_CONTAINERS_KEY] != null)
                        containers = (Dictionary<string, Dictionary<string, UserControl>>)Session[SESSION_CONTAINERS_KEY];

                    return containers;
                }
            }
            #endregion

            #region 创建用户控件实列的方
            //这个方法很简单,我们只是把传过来的controlName,controlKey进行格式转换。对于controlName,我们把*~/App_Controls/{0}*其中的{0}参数, 替换成想 *~/App_Controls/MyControl.ascx"的形式,而把该Control的ID,用Guid值替换掉*MyControl_{0}*中的{0}参数
            protected UserControl CreateControlInstance(string controlName, string controlKey)
            {

                UserControl newControl =
                    (UserControl)LoadControl(string.Format(PATH_TO_CONTROL, controlName));


                newControl.ID = string.Format(controlKey, Guid.NewGuid().ToString());

                return newControl;
            }
            #endregion

            #region
            //接受两个参数,一个是您所添加的用户控件,一个是您想把该用户控件添加到传过来的指定的PlaceHolder.首先该方法会检查在Containers容器的列表中,连同添加到其中的Controls是否保存在Sesssion变量中,在这里您是否还记得我在上面提到的SESSION_CONTAINERS_KEY常量,它就是用作Session变量的retreival key。
            //如果这个Session变量为空,也就意味着用户是首次添加一个用户控件,之后则创建一个Container的实列。
            //该代码也检查在该Container容器中是否包含以PlaceHoler的ClientID为名称的字典,如果没有则说明用户控件是首次添加到指定的PlaceHolder控件中,为此,则添加一个新的空的的记录来保存将来要添加到该PlaceHolder中的UserControl或UserControls。
            //随后在检查在该指定的PlaceHolder中是否包含以用户控件的ClientID为健的控件,如果没有,则添加到其PlaceHolder中。
            //最后。Session[SESSION_CONTAINERS_KEY]被新的或者以更新的container所更新。

            protected void AddControlToContainer(UserControl c, PlaceHolder phContainer)
            {

                Dictionary<string, Dictionary<string, UserControl>> containers = null;


                if (Session[SESSION_CONTAINERS_KEY] != null)
                    containers = (Dictionary<string, Dictionary<string, UserControl>>)Session[SESSION_CONTAINERS_KEY];


                if (containers == null)
                    containers = new Dictionary<string, Dictionary<string, UserControl>>();


                if (!containers.ContainsKey(phContainer.ClientID))
                    containers.Add(phContainer.ClientID, new Dictionary<string, UserControl>());


                if (containers[phContainer.ClientID] != null)
                    containers[phContainer.ClientID].Add(c.ClientID, c);


                Session[SESSION_CONTAINERS_KEY] = containers;
            }
            #endregion

            #region 负责把所有的用户控件添加到Aspx页面中
            // 该方法接收一个PlaceHolder作为其参数,并首先验证并确认在Container中是否包含相应的PlaceHolder,如果有,则循环所有指定Container中的所有记录,并把每一个用户控件添加到接收的PlaceHolder中。之后将会自动呈现在Aspx页面中
            protected void LoadExistingControls(PlaceHolder phContainer)
            {

                if (
                    (this.Container != null) &&
                    (this.Container.Count > 0)
                    )
                {

                    if (!this.Container.ContainsKey(phContainer.ClientID))
                        return;


                    phContainer.Controls.Clear();


                    foreach (KeyValuePair<string, UserControl> value in this.Container[phContainer.ClientID])
                    {
                        phContainer.Controls.Add(value.Value);
                    }
                }
            }
            #endregion

        }
    主页面New_Oper1.aspx
    public partial class New_Oper1 : BasePage
        {
            private const string MYCONTROL = "MyControl.ascx";
            private const string MYCONTROL_ID = "MyControl_{0}"; //确保所有的Control是否添加到页面的ControlCollection中
            protected void Page_Init(object sender, EventArgs e)
            {
                LoadExistingControls(this.phContainer);
            }
         
            protected void Page_Load(object sender, EventArgs e)
            {
                         

            }

            public void AddOper()
            {
                UserControl c = CreateControlInstance(MYCONTROL,MYCONTROL_ID);
                AddControlToContainer(c, this.phContainer);
                LoadExistingControls(this.phContainer);
          
            }

            protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
            {
                
                                AddOper();
            }

    2009年8月27日 5:27
  • 发了哈

    2009年8月27日 6:26
  • 你好,
    你自定义的这个就是一个UserControl。
    这个事件DropDownList1_SelectedIndexChanged1如果是在UserControl中定义的,而且已经设置了AutoPostback=true,触发应该是没有问题的。
    其实可以简单做一个例子试试。
    1.右键单击你的项目选择添加新项,添加一个后缀名为ascs的web usercontrol 项。
    2.在usercontrol中,从工具栏中拖一个dripdownlist控件到界面上,设置其AutoPostback=true,并添加selectedchanged处理事件。
    3.把该usercontrol直接从项目窗口中拖到一个主页面中。
    4.最后测试该主页面。
    Microsoft Online Community Support
    2009年8月28日 3:05