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

本文关键字:复选框 动态 何获取 获取 | 更新日期: 2023-09-27 18:24:21

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

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。有人能解释一下如何获得校验值吗。

提前谢谢。

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

当创建任何类型的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将放弃"不再存在"控件的视图状态。

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

  1. 这个属性。Page.Cache不是页面的本地缓存。你在这里输入的任何内容都会在整个应用程序池中共享(甚至这个属性上的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);
            }
        }
    }