我在运行时动态添加了一些复选框,我需要知道下次重新加载时是否检查了它们。 我从存储在ViewState中的列表中加载复选框值。 问题是:我什么时候保存或检查Checked的价值? 我尝试了复选框处理事件和我添加复选框的占位符,但它没有被触发。也就是说,当我提出一个断点时,它并没有停止。那么有什么建议吗?
这是一个示例代码,但我认为没有必要:
void LoadKeywords()
{
bool add = true;
foreach (string s in (ViewState["keywords"] as List<string>))
if (s == ddlKeywords.SelectedItem.Text)
{
add = false;
continue;
}
if (add)
(ViewState["keywords"] as List<string>).Add(ddlKeywords.SelectedItem.Text);
foreach (string s in (ViewState["keywords"] as List<string>))
{
CheckBox kw = new CheckBox();
kw.Disposed += new EventHandler(kw_Disposed);
kw.Text = s;
PlaceHolderKeywords.Controls.Add(kw);
}
}
答案 0 :(得分:2)
如果要在运行时动态添加控件,则必须确保在加载ViewState之前将这些控件填充到页面的Control集合中。这样每个复选框的状态都可以从Viewstate重新水合。例如,Page Load事件为时已晚。
通常,您将在Init事件期间(加载视图状态之前)动态添加CheckBox控件,然后在Load事件期间(加载视图状态之后)读取Checkbox控件中的值。
例如:
protected override void OnInit(EventArgs e)
{
//load the controls before ViewState is loaded
base.OnInit(e);
for (int i = 0; i < 3; i++)
{
CheckBox cb = new CheckBox();
cb = new CheckBox();
cb.ID = "KeyWord" + i.ToString();
cb.Text = "Key Word"
MyPlaceHolder.Controls.Add(new CheckBox());
}
}
//this could also be a button click event perhaps?
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (Page.IsPostBack)
{
//read the checkbox values
foreach(CheckBox control in MyPlaceHolder.Controls)
{
bool isChecked = control.Checked;
string keyword = control.Text;
//do something with these two values
}
}
}
希望有所帮助
**** **** EDIT 忘记提到这显然只是演示代码 - 你需要充实它。
有关ASP.Net中动态控制渲染的更多信息,请查看this article on 4Guys。
有关ASP.Net中页面生命周期的更多信息,请查看MSDN。
答案 1 :(得分:0)
如何:
尝试添加一个处理checked()的javascript代码, 你可以使用document.findElementById(ID)获取复选框,然后将复选框的值存储到具有runat =“server”属性的hiddenfield中。
何时: 在pageload上,检查page是否为postback(),并检查hiddenfield(s)值(S)。或者添加一个提交按钮(并将其事件放在后面的代码中,runat =“server”属性)。
希望这有助于你。