关于动态控件的事件响应和控件的生命周期的理解(应用)

来源:互联网 发布:linux vim 跳到指定行 编辑:程序博客网 时间:2024/06/06 03:00

      平时我们在写程序时有时会动态的向指定页面添加控件,这些控件中回发过程中一般会从界面上消失,或者取不到状态值

实际上这些动态创建的控件的值是保存在ViewState中的,并且在页面回发的过程中也试图恢复这些值,但是由于没有在Page_Load结束之前重建这些状态所依附的控件(根据UniqueID来唯一确定这些控件,因此给动态控件设置主键十分重要),所以ASP.Net没有地方把状态放回控件

     由于控件不会放入ViewStatus中,如果你在页面设计时放置一个控件,那么页面每一次实例化时会根据设计代码所编译的可执行代码,重新创建这个控件。如果你在页面运行时动态创建一个控件,就必须保证下一次页面PageLoad之前在自己的代码中重建这个控件(原因参见上一篇文章),因为PageLoad之后页面会立即给这个控件装载状态,所以你必须在PageLoad之前重新实例化这个控件

 

 

方法1:在PageLoad中处理

定义一个属性来标识控件是否修改,在OnClick事件中用一个ViewState来标识这个状态,将其设置为true.以标识视图状态修改。然后在Click中创建这个控件。在PageLoad中判断如果这个状态更改了,再重新建一次这个动态控件

public partial class _Default : System.Web.UI.Page
{
    bool ShowCheckBox
    {
        get { return (ViewState["ShowCheckBox"] == null) ? false : (bool)ViewState["ShowCheckBox"]; }
        set { ViewState["ShowCheckBox"] = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (ShowCheckBox)  //如果状态是修改的,再重新加载一次
        {
            SetControl();
        }
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        ViewState["ShowCheckBox"] =true;  //标识一个状态来表明在视图状态中已修改
        CheckBox chb = new CheckBox();
        chb.ID = "Test";
        chb.AutoPostBack = true;
        //chb.CheckedChanged += new EventHandler(chb_CheckedChanged);这里写的委托没有用,因为回发后状态会修改.
        this.form1.Controls.Add(chb);
    }
    void chb_CheckedChanged(object sender, EventArgs e)
    {
        btn.Text = "bbb";
    }

    private void SetControl()
    {
        CheckBox chb = new CheckBox();
        chb.ID = "Test";
        this.form1.Controls.Add(chb);
        chb.CheckedChanged += new EventHandler(chb_CheckedChanged);
    }

}

 

方法2(在PageLoad状态之前加载控件,通过重定LoadViewState方法实现,只是将Page_Load中的代码移动LoadViewState中

    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        if (ShowCheckBox)
        {
            CheckBox chb = new CheckBox();
            chb.ID = "Test";
            this.form1.Controls.Add(chb);
            chb.CheckedChanged += new EventHandler(chb_CheckedChanged);
        }
    }

原创粉丝点击