如何获取动态生成的复选框的值
本文关键字:复选框 动态 何获取 获取 | 更新日期: 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事件上产生开销。缓解这种情况的一种方法是将控件填充到服务器的缓存中,但在使用这种方法时需要注意两件非常重要的事情:
- 这个属性。Page.Cache不是页面的本地缓存。你在这里输入的任何内容都会在整个应用程序池中共享(甚至这个属性上的MSDN页面也会产生误导)
您输入的每个值都必须由一个特定的键引用,该键对每个用户的会话都是唯一的(因为正如#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); } } }