我在placeHolder中动态添加了一个radiobuttonlist,里面的radio也是动态添加的,请问当点提交时怎么获取在radioButtonList中选中的值,谢了,我只有10分,不好意思。。

解决方案 »

  1.   

    用container.FindControl("itemList")无法找到,说空引用
      

  2.   

    原来是if(!Page.IsPostback)在作怪,不知为什么动态控件,在LOAD里加这个东西的话就没办法操作,不加就可以??
      

  3.   

    动态添加控件在页面postback后就消失了,你不加if(!Page.IsPostback)等于postback后再次创建了这些动态控件.
      

  4.   

    下面这段代码,实现了在placeHolder中动态添加了一个radiobuttonlist,item也是动态添加的,点击提交button后,将 radiobuttonlist选中的值赋到页面上的一个TextBox中.namespace test
    {
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button Button1;
    protected System.Web.UI.WebControls.TextBox TextBox1;
    protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    RadioButtonList rbl = new RadioButtonList();

    this.PlaceHolder1.Controls.Add(rbl);
    //注意这里,现加载radiobutton,再添加item项 if(!IsPostBack)
    {
    for(int i=0;i<5;i++)
    {
    rbl.Items.Add(new ListItem(i.ToString(),i.ToString()));
    }
    }
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void Button1_Click(object sender, System.EventArgs e)
    {
    this.TextBox1.Text = ((RadioButtonList)this.PlaceHolder1.Controls[0]).SelectedIndex.ToString();
    }
    }
    }为什么要先加载radiobuttonlist,然后再给他添加item项呢?大致的说,在创建动态控件时(this.PlaceHolder1.Controls.Add(rbl);),控件处于原始阶段(控件生存周期的开始),而此时父控件PlaceHolder1处于Load阶段(静态控件的阶段变化和页面是一致的,Page_Load时候,页面处于Load阶段),这时候,父控件会调用子控件的一些方法,让子控件追赶上父控件的阶段,使得在这步骤中,子控件radiobuttonlist迅速从init->load,而在init阶段,会调有TrackViewState方法追踪并将控件后面的变化(本例中指的是添加item项)保存到stateBag对象中.在this.PlaceHolder1.Controls.Add(rbl);之后来添加item项,由于调用了TackViewState, 这个变化被记录下来,如果添加item项位于,this.PlaceHolder1.Controls.Add(rbl);之前,那么由于还没有启动视图状态追踪,所以这个变化并没有被保存下来,在点击提交按钮postback后,就自然找不到radiobuttonlist的item项,因为这时根本不存在这些项,所以SelectedIndex的值就为1.
      

  5.   

    你可以参考思归2004年10月动态控件的状态问题的讨论,以到达更透彻的认识.
    http://blog.joycode.com/saucer/archive/2004/10.aspx