用户控件中设置一个属性,如:private bool _IsList = false;
    public bool IsList
    {
        set{_IsList = value;}
    }调用用户控件的页面中设置一个BUTTON,当Button回发时,设置用户控件的IsList属性,假设用户控件ID为ClassID,如下代码:    protected void Button1_Click(object sender, EventArgs e)
    {
        ClassID.IsList = true;
    }
问题:当页面回发时按上面这样无法设置用户控件的IsList属性,断点调试了一下,当页面回发时页面的执行顺序是,先执行页面的Page_Load,再执行用户控件的Page_Load(如果在页面的Page_Load中设置了属性值此时也会生效),然后再执行页面的回发事件,如上面的Button1_Click,最后一步仅仅是设置了用户控件的属性就停止了,没有再接着执行页面控件的Page_Load.如何解决?如下代码虽然可以解决,但始终觉得别扭。    #region 是否以列表形式显示,默认为下拉
    /// <summary>
    /// 是否以列表形式显示,默认为下拉
    /// </summary>
    private bool _IsList = false;
    public bool IsList
    {
        set
        {
            if (!IsPostBack)
            {
                _IsList = value;
            }
            else
            {
                //具体的执行代码,以下代码其实已经在用户控件的Page_Load中写过一次了
                if (_IsList)
                {
                    ClassListID.Attributes.Add("size", "20");
                    ClassListID.Style.Add(HtmlTextWriterStyle.Width, "280px;");
                }
                //感觉此处应该再调用一次Page_Load,但如何调用呢?

            }
        }
    }

解决方案 »

  1.   

    首先,你所说的现象,是Asp.net页面生命周期,执行顺序就是这样的,不可能更改,详细可以参考我的博客:
    http://blog.csdn.net/ojlovecd/article/details/2691116
    其次,你在控件的Page_Load里做什么操作了?为什么在Button事件赋值以后你要重新执行控件的Page_Load?
      

  2.   

    我需要在回发中设置用户控件的一些属性,以此达到动态设置用户控件中的dropdownlist的选项.贴上全部代码吧.
    public partial class Admin_Class_list : System.Web.UI.UserControl
    {
        #region 是否允许修改,默认允许修改
        /// <summary>
        /// 是否允许修改,默认允许修改
        /// </summary>
        private bool _Enable = true;
        public bool Enable
        {
            set
            {
                _Enable = value;
                if(IsPostBack)
                {
                    if (!_Enable)
                    {
                        ClassListID.Attributes.Add("disabled", "disabled");
                    }
                }
            }
        }
        #endregion    #region 是否以列表形式显示,默认为下拉
        /// <summary>
        /// 是否以列表形式显示,默认为下拉
        /// </summary>
        private bool _IsList = false;
        public bool IsList
        {
            set
            {
                _IsList = value;
                if (IsPostBack)
                {
                    if (_IsList)
                    {
                        ClassListID.Attributes.Add("size", "20");
                        ClassListID.Style.Add(HtmlTextWriterStyle.Width, "280px;");
                    }
                }
            }
        }
        #endregion
        
        #region 是否显示选择项,默认显示
        /// <summary>
        /// 是否显示选择项,默认显示
        /// </summary>
        private bool _ShowFirst = true;
        public bool ShowFirst
        {
            set { _ShowFirst = value; }
        }
        #endregion    #region 一级分类的文字说明,默认"---请选择---"
        /// <summary>
        /// 一级分类的文字说明,默认"---请选择---"
        /// </summary>
        private string _FirstText = "---请选择---";
        public string FirstText
        {
            set { FirstText = value; }
        }
        #endregion
        
        #region 获取或设置DropDwonList的选定值
        /// <summary>
        /// 获取或设置DropDwonList的选定值
        /// </summary>
        private string _SetSelectValue;
        private string _GetSelectValue;
        public string SelectValue
        {
            set
            {
                if (IsPostBack)
                {
                    ClassListID.SelectedValue = value;
                }
                else
                {
                    _SetSelectValue = value;
                }
            }
            get { return _GetSelectValue; }
        }
        #endregion    protected void Page_Load(object sender, EventArgs e)
        {
            _GetSelectValue = ClassListID.SelectedValue;
            ClassListID.Items.Clear();
            string Sql;
            if (Cache["ClassID"] != null && Cache["ClassID"].ToString() != "")
            {
                Sql = "SELECT * FROM ProjectClass WHERE ProjectClass.ParentPath LIKE '%" + Cache["ClassID"].ToString() + ",%' Or ParentID = " + Cache["ClassID"].ToString() + " ORDER BY RootID,OrderID";
            }
            else
            {
                Sql = "SELECT * FROM ProjectClass ORDER BY RootID,OrderID";
            }
            SqlDataReader dr = SqlHelper.ExecuteReader(SqlHelper.ConnectionString, CommandType.Text, Sql);
            if (!_Enable)
            {
                ClassListID.Attributes.Add("disabled", "disabled");
            }
            if (_IsList)
            {
                ClassListID.Attributes.Add("size", "20");
                ClassListID.Style.Add(HtmlTextWriterStyle.Width, "280px;");
            }
            if (_ShowFirst)
            {
                ClassListID.Items.Add(new ListItem(_FirstText, "0"));
            }
            while (dr.Read())
            {
                string Nbsp = null; //加空格的变量;
                string optionText = null;
                if (Convert.ToInt16(dr["ParentID"]) == 0)
                {
                    optionText = HttpUtility.HtmlDecode("&nbsp;") + dr["ClassName"];
                }
                else
                {                int STM_Path = Convert.ToInt16(dr["Depth"]); //如果ParentID不为0说明不是根元素,求出它是那层元素;
                    for (int i = 0; i < STM_Path; i++)
                    {
                        //每一层加4个空格;
                        Nbsp += HttpUtility.HtmlDecode("&nbsp;&nbsp;");                }
                    optionText = Nbsp + "├" + dr["ClassName"];
                }            ClassListID.Items.Add(new ListItem(optionText, dr["ClassID"].ToString()));
            }
            dr.Close();
            dr.Dispose();
            if (!IsPostBack)
            {
                ClassListID.SelectedValue = _SetSelectValue;
            }
        }
    }
      

  3.   

    把Page_Load里从数据库取数据的代码抽出来,放到一个独立的方法中,例如起名为GetData();public void GetData()
    {
            _GetSelectValue = ClassListID.SelectedValue;
            ClassListID.Items.Clear();
            string Sql;
            if (Cache["ClassID"] != null && Cache["ClassID"].ToString() != "")
            {
                Sql = "SELECT * FROM ProjectClass WHERE ProjectClass.ParentPath LIKE '%" + Cache["ClassID"].ToString() + ",%' Or ParentID = " + Cache["ClassID"].ToString() + " ORDER BY RootID,OrderID";
            }
            else
            {
                Sql = "SELECT * FROM ProjectClass ORDER BY RootID,OrderID";
            }
            SqlDataReader dr = SqlHelper.ExecuteReader(SqlHelper.ConnectionString, CommandType.Text, Sql);
            if (!_Enable)
            {
                ClassListID.Attributes.Add("disabled", "disabled");
            }
            if (_IsList)
            {
                ClassListID.Attributes.Add("size", "20");
                ClassListID.Style.Add(HtmlTextWriterStyle.Width, "280px;");
            }
            if (_ShowFirst)
            {
                ClassListID.Items.Add(new ListItem(_FirstText, "0"));
            }
            while (dr.Read())
            {
                string Nbsp = null; //加空格的变量;
                string optionText = null;
                if (Convert.ToInt16(dr["ParentID"]) == 0)
                {
                    optionText = HttpUtility.HtmlDecode("&nbsp;") + dr["ClassName"];
                }
                else
                {                int STM_Path = Convert.ToInt16(dr["Depth"]); //如果ParentID不为0说明不是根元素,求出它是那层元素;
                    for (int i = 0; i < STM_Path; i++)
                    {
                        //每一层加4个空格;
                        Nbsp += HttpUtility.HtmlDecode("&nbsp;&nbsp;");                }
                    optionText = Nbsp + "├" + dr["ClassName"];
                }            ClassListID.Items.Add(new ListItem(optionText, dr["ClassID"].ToString()));
            }
            dr.Close();
            dr.Dispose();
    }    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GetData();
                ClassListID.SelectedValue = _SetSelectValue;
            }
        }然后在页面的Button事件中:    protected void Button1_Click(object sender, EventArgs e)
        {
            ClassID.IsList = true;
            ClassID.GetData();
        }
      

  4.   

    已经解决了,和ojlovecd的方法一样.不过还是非常感谢.To:wxr0323
    我的关键问题是要在页面的回发事件中去设置用户控件的属性值,ViewState应该是保持控件状态的吧,所以应该用不上.还是要谢谢你回复.
      

  5.   

       protected void Button1_Click(object sender, EventArgs e)
        {
            ClassID.IsList = true;
            ClassID.GetData();
        }
    执行过程是,先执行按钮下面的事件,然后回发,执行page_onload事件,
    如果回发显示数据,就需要类似于数据绑定控件的事件里面一样 的处理方式有兴趣可以加入.net开源交流群 共同讨论学习69594961