代码如下:public partial class SDGroupPanel : System.Web.UI.UserControl
    {
        private CheckBoxList checkboxlist = new CheckBoxList();
        private RadioButtonList sortRadioList = new RadioButtonList();//排序选择  protected override void CreateChildControls()
        {
            EventHandler handler = base.Events[selectedObject] as EventHandler;
            if (handler != null)
            {
                this.checkboxlist.SelectedIndexChanged += handler;
            }
            this.checkboxlist.SelectedIndexChanged += new EventHandler(checkboxlist_SelectedIndexChanged);            this.panel.Controls.Add(checkboxlist);            this.Controls.Add(panel);            ChildControlsCreated = true;
        }
}   /// <summary>
        /// 在该事件中初始化排序所需的下拉项与单选项
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void checkboxlist_SelectedIndexChanged(object sender, EventArgs e)
        {
            InitSortButton();
        }        private void InitSortButton()
        {
            if (SortDropDownList.Items.Count > 0)
            {
                panel.Controls.Add(SortDropDownList);
                panel.Controls.Add(sortRadioList);                if (sortRadioList.Items.Count == 0)
                {
                    sortRadioList.Items.Add(new ListItem("升序", "1"));
                    sortRadioList.Items.Add(new ListItem("降序", "0"));
                }
                sortRadioList.RepeatDirection = RepeatDirection.Horizontal;
                sortRadioList.RepeatLayout = RepeatLayout.Flow;
                sortRadioList.AutoPostBack = true;            sortRadioList.SelectedIndexChanged += checkboxlist_SelectedIndexChanged;
                if (base.Events[sortObject] != null)
                {
                    EventHandler ev = base.Events[sortObject] as EventHandler;
                    this.sortRadioList.SelectedIndexChanged += ev;
                }
            }
        }
现在的问题就是点击sortRadioList按钮时,触发不了sortRadioList的SelectedIndexChanged事件。请问大家要如何解决呢?

解决方案 »

  1.   

    想要触发事件,那么它应该在page_load真正结束之前就已经初始化了,就好象你的SelectedIndexChanged一样。
      

  2.   

    你的InitSortButton让人看得一头雾水,完全没有什么道理,不知道你是凭对什么机制的理解来写这段代码的。
      

  3.   

    InitSortButton方法是在this.checkboxlist.SelectedIndexChanged时调用,也就是想在checkboxlist被选中时才在界面上显示SortDropDownList,sortRadioList控件。但有一个问题,因为sortRadioList控件的autopostback为true,就是sortRadioList被选中时,SortDropDownList,sortRadioList控件又从界上上消失了,所以我又想在sortRadioList的SelectedIndexChanged事件中重新调用一次InitSortButton,让SortDropDownList,sortRadioList控件重新显示出来,但发现这样行不通,根本触发不了sortRadioList的SelectedIndexChanged事件。
      

  4.   


    事件是有绑定的,但是是在this.checkboxlist.SelectedIndexChanged中绑定,可能问题就是如sp1234所说,一定要在page_load事件结束前绑定才有效。
      

  5.   

    当你的InitSortButton执行完,页面实例对象也就要Render从而输出html给浏览器端,然后立刻就销毁了。它怎么可能去触发那两个事件?你看来还是以为这个winform,而不是asp.net。要想触发事件,在你的CreateChildControls中要去在panel中重建那两个对象,并且注册事件监听。但是不应该去执行Items.Add和设置.AutoPostBack,因为这些状态值会被asp.net自动重新填充。从控件的生命周期机制上说,在你page_load真正完成之前,你要在控件树上panel中重建SortDropDownList和sortRadioList控件对象(要么保证ID与之前的相同,要么保证相同的Index下存在类型完全相同的控件)。这样asp.net找到了匹配的控件,才知道给它回填ViewState(既各种属性以及调用创建子控件),并且再提交浏览器端提交的新数据,以便在page_load真正完全执行完毕之后去触发xxxxIndexChanged之类的事件。
      

  6.   

    基本上你的CreateChildControls中要有类似这样的代码:object flag=ViewState["存在另外两个控件"];
    if(flag!=null && (bool)flag)
    {
        RadioButtonList sortRadioList = new RadioButtonList();
        sortRadioList.ID = "sortRadios";     //设置同一个ID,这样就不必要求在panel中相同位置找到它
        panel.Controls.Add(SortDropDownList);    //从你的代码看不出这是哪里初始化的
        panel.Controls.Add(sortRadioList);
        sortRadioList.SelectedIndexChanged += checkboxlist_SelectedIndexChanged;
        if (base.Events[sortObject] != null)
        {
             EventHandler ev = base.Events[sortObject] as EventHandler;
             this.sortRadioList.SelectedIndexChanged += ev;
        }
      

  7.   


    嗯,我本是想在CreateChildControls中一并添加SortDropDownList,sortRadioList,但这两个控件的显示又是要根据调用页面给该用户的SortDropDownList.Items属性的填充数据来控制,而CreateChildControls方法在回发后的执行顺序又在Page_Load之前(调用页是在Page_Load事件中给SortDropDownList.Items属性填充值的),所以都不知道要在那事件中来控制SortDropDownList,sortRadioList的显示了。
      

  8.   


    SortDropDownList是这个控件中的一个属性。
            private DropDownList sortDropDownList;
            /// <summary>
            /// 可排序项
            /// </summary>
            public DropDownList SortDropDownList
            {
                get
                {
                    if (sortDropDownList == null)
                    {
                        sortDropDownList = new DropDownList();
                    }
                    return sortDropDownList;
                }
                set { sortDropDownList = value; }
            }
      

  9.   


    请问一下,object flag=ViewState["存在另外两个控件"];这个是什么意思?
      

  10.   

    生命周期的缘故,如果你要处理PostData 及相应事件,那么最迟也要在Page_load中创建控件