asp.net WebControl事件顺序和ViewState

时间:2011-10-19 13:37:12

标签: c# asp.net

我有一个自定义类创建一个下拉列表控件,如下所示:

public class IHGridView : System.Web.UI.WebControls.WebControl
{
    private string _dataSource = "not set yet";

    public string DataSource
    {
        get { return _dataSource; }
        set { _dataSource = value; }
    }
}

编辑:

    protected override void OnInit(EventArgs e)
    {
        // VIewState is alive. When I select an option and submit, after postback it's selected value is the one I selected.
        this.Controls.Add(_dropDownList);
    }

    protected override void CreateChildControls()
    {
        // VIewState is dead. When I select an option and submit, after postback it's selected value is the default one.
        this.Controls.Add(_dropDownList);
    }

所以,现在我想出了我必须在“OnInit”中添加控件的结果。 但是,这个“OnInit”是这个类写的第一个空白。 如果我想在之前使用像“DataSource”这样的属性,“OnInit”无效...... 我该怎么做?

编辑:

    protected void Button1_Click(object sender, EventArgs e)
    {
        IHGridViewTest2.DataSource = "fired";
    }

在触发aspx页面中的按钮时设置DataSource。

1 个答案:

答案 0 :(得分:0)

为什么要添加_dropDownList两次?一旦在OnInit中就足够了,OnInit就是你应该在控件集合中添加它的地方 - 这样就可以持久化和恢复viewstate。

以访问和绑定_dropDownList为例,覆盖DataBind方法 - 此时所有属性都可供您使用。

protected override void DataBind(){
    base.DataBind();
    _dropDownList.DataSource = this.DataSource;
    _dropDownList.DataBind();
}

这是伪代码,尚未经过测试或验证

编辑:

调用覆盖DataBind方法

protected void Button1_Click(object sender, EventArgs e)
{
    IHGridViewTest2.DataSource = "fired";
    IHGridViewTest2.DataBind();
}