我已经动态生成了复选框,并通过下面的代码点击按钮将它们添加到面板中。
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。任何人都可以解释如何获取选中的值。
提前致谢。
答案 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指出,此缓存在所有会话中都是全局的)。这意味着密钥应包含唯一标识当前会话的内容,例如会话密钥。
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);
}
}
}