问题如下Step1:用户在IE中点击CheckBox为选中(这些CheckBox是在Page_Load事件中动态建立的),然后PostBack到服务器Step2:ASP.NET系统在Page_Load事件前,调入各个控件的ViewState,可是这时,这些CheckBox并未建立。Step3:Page_Load事件时,CheckBox再次被动态建立,由于错过了调入ViewState,我无法知道用户选中了哪些?请问大家,我如何才能为动态建立的控件追加ViewState?

解决方案 »

  1.   

    放在<from>里面回传可以取值的,
    request.form["controlname"]
      

  2.   

    呵呵,谢谢,这个我知道,这样做比较麻烦,
    之前做多级下拉菜单就是这样的,上一级的选择,决定了下一级的内容。有没有LoadView的方法
      

  3.   

    protected void Page_Load(object sender, EventArgs e)
            {            if (!IsPostBack)
                {
                    LoadTextBox();
                }
            }
            public bool IsDynamicLoadControl
            {
                get
                {
                    object dynamic = ViewState["IsDynamicLoadControl"];
                    return dynamic == null ? false : true;
                }
                set
                {
                    ViewState["IsDynamicLoadControl"] = value;
                }
            }
            protected override void LoadViewState(object savedState)
            {
                base.LoadViewState(savedState);            if (IsDynamicLoadControl)
                {
                    LoadTextBox();
                }
            }        private void LoadTextBox()
            {
                for (int i = 0; i < 10; i++)
                {
                    TextBox input = new TextBox();
                    input.ID = "input" + i.ToString();
                    this.form1.Controls.Add(input);
                }
                IsDynamicLoadControl = true;
            }
      

  4.   


    你的 Strp3 错了!在Page_Load结束之后(Page_LoadCompleted也结束),asp.net会对所有通过Control.Add添加入的控件才设置ViewState,并且这些控件的客户端提交值也会设置,并且准备好随后触发相关事件。LoadViewState有两次,一次在Page_Load之前,一次在之后。两次!
      

  5.   

    你唯一要注意的是,动态添加的控件一定要确保其id与上一次输出页面时的完全一致(当然此时控件类型也一致)。因此,要对动态控件设置id属性,而最好不要忽略这个。如果忽略asp.net按照顺序给控件设置id,这个有可能变化。见到那地创建控件,然后设置id,然后就可以放入控件树。如果放入控件树之后再设置id就无效了。而所有其它属性都可以在放入控件树之前或者之后设置,无所谓。
      

  6.   

    谢谢[lovehongyun],你的办法是重载了LoadViewState方法,在页面LoadViewState之前,建立控件。
    这和把建立控件的语句放到OnInit里是一样的效果。我现在遇到的麻烦事情你是,要生成一个表格,这个表格有些过滤条件,过滤条件来自几个DropDownList控件,
    想从DropDownList控件里取出值,必须在LoadViewState之前建立DropDownList控件,
    要建立表格,必须在LoadViewState之后-这样才能取得过滤值可是表格内还有几个checkbox需要保存状态,这事情就头大了。听说,有个消息回绕什么的,会发送两遍,这个特征对解决这个问题有帮助吗?实在不行的话,只好从Request.form里硬取了。
      

  7.   

    当你在page_load中重建checkbox并放入控件树之后,你无需读取后台数据源中的数据来设置checkbox的checked值,也无需设置其它许多动态改变的值,这时候读取后台数据库反而是浪费时间的无用功。因为page_load之后,这些状态值(一个小小的checkbox中也包括checked值、样式等等许许多多状态)都会自动恢复。
      

  8.   


    谢谢,一语点醒梦中人
    请问Page_LoadCompleted也结束后的,事件的名称是什么?
    PreRender吗?
      

  9.   

    sp1234,就是NB啊,
    把建立控件放到Page_Load就好了,呵呵。
    之前我是放到Onint一部分,放到EventHander一部分
    马上给分
      

  10.   


    LoadView时从来不触发事件。第二次是在page_loadcomplete之后,接下来触发的控件的“值修改了”这一类事件(IPostbackEventHnadler.RaisePostbackEvent引发的事件)之前,默默执行的。
      

  11.   

    sp1234,就是NB啊,
    把建立控件放到Page_Load就好了,呵呵。