如何获取动态生成的复选框的值

时间:2015-11-24 16:55:12

标签: c# asp.net

我已经动态生成了复选框,并通过下面的代码点击按钮将它们添加到面板中。

foreach (string filename in filepaths)
{
  CheckBox chk = new CheckBox();
  chk.Text = Path.GetFileName(filename.ToString());

  Panel1.Controls.Add(chk);
  Panel1.Controls.Add(new LiteralControl("<br>"));                  
}

现在问题是我无法使用下面的代码

访问另一个按钮上的选中值
if (!IsPostBack) {
foreach(Control c in Panel1.Controls) {
    if ((c is CheckBox) && ((CheckBox) c).Checked) {
        lblerr.Text = c.ToString();
    }
  }
}

我发现在按钮上单击页面加载,因此面板中的控件返回null。任何人都可以解释如何获取选中的值。

提前致谢。

1 个答案:

答案 0 :(得分:0)

在有问题地创建任何类型的System.Web.UI.WebControl类时,在回发期间重建页面时不会隐式重新创建它。您必须在PageLoad中再次调用创建控件的方法:

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostback)
        BuildCheckBoxes();
}
private void BuildCheckBoxes()
{
    foreach (string filename in filepaths)
    {
      CheckBox chk = new CheckBox();
      chk.Text = Path.GetFileName(filename.ToString());

      Panel1.Controls.Add(chk);
      Panel1.Controls.Add(new LiteralControl("<br>"));                  
    }
}

这必须在PageLoad中完成,以便在恢复ViewState时存在控件。否则,.NET将丢弃&#34;不再存在的控件的视图状态&#34;。

请记住,如果要构建大量控件,这将在PageLoad事件上产生开销。缓解这种情况的一种方法是将控件填充到服务器的缓存中,但使用此方法时需要注意几个非常重要的事项:

  1. 属性this.Page.Cache是​​ NOT 页面的本地。您放在此处的任何内容都会在整个应用程序池中共享(即使此属性上的MSDN页面也具有误导性)。
  2. 您输入的每个值必须由每个用户会话唯一的特定键引用(因为,#1指出,此缓存在所有会话中都是全局的)。这意味着密钥应包含唯一标识当前会话的内容,例如会话密钥。

    private int DynCheckBoxCount
    {
        get { return (int)this.ViewState["DynCheckBoxCount"]; }
        set { this.ViewState["DynCheckBoxCount"] = value; }
    }
    private void BuildCheckBoxes()
    {
        if (!this.IsPostBack)
        {
            int i = 0;
            foreach (string filename in filepaths)
            {
                CheckBox chk = new CheckBox();
                chk.Text = Path.GetFileName(filename); // Don't do a .ToString() on a string.  It's unnecessary, ugly code, and opens the door for NullReferenceExceptions.
                chk.Style.Add(HtmlTextWriterStyle.Display, "block");
                Panel1.Controls.Add(chk);
                string key = string.Format("{0}_{1}", this.Session.SessionID, i++);
                this.Page.Cache[key] = chk;
            }
            this.DynCheckBoxCount = i;
        }
        else
        {
            for (int i = 0; i < this.DynCheckBoxCount; i++)
            {
                string key = string.Format("{0}_{1}", this.Session.SessionID, i);
                CheckBox chk = (CheckBox)this.Page.Cache[key];
                this.Panel1.Controls.Add(chk);
            }
        }
    }