我最近在asp.net中创建了一个代表打印机的Web用户控件。用户控件包含一个用于设置IsChecked属性的复选框:
protected bool isChecked;
/// <summary>
/// Is printer selected
/// </summary>
public bool IsChecked
{
get { return isChecked; }
set { isChecked = value; }
}
protected void chkIsSelected_CheckedChanged(object sender, EventArgs e)
{
if (isChecked)
{
isChecked = false;
}
else
{
isChecked = true;
}
}
我希望能够使用复选框选择打印机(也可以选择多选)并使用“添加所选”按钮添加所选的“打印机(用户控件)”。
protected void btnSubmitSelection_Click(object sender, EventArgs e)
{
Dictionary<string, string> addResults = new Dictionary<string, string>();
foreach (PrinterControlSearch pctrl in printerControls)
{
if (pctrl.IsChecked)
{
addResults.Add(pctrl.printer.PrinterName, PrinterOperations.addPrinter(client, pctrl.printer));
}
}
}
如果我在Page_Init或Page_Load事件中添加Web用户控件,则一切正常。在从主页面中的AddSelected按钮回发并且为检查的复选框设置了IsChecked属性时,对每个已检查的控件逐个触发CheckedChanged事件。
但是,如果我使用从搜索按钮回发触发的方法将Web用户控件添加到页面,则控件显示正常,但CheckedChanged事件从不在AddSelected回发和IsChecked属性上触发永远是假的,因为它永远不会被设置。我使用的checkBox不会导致AutoPostBack。
为什么会发生这种情况,我怎样才能让它每次都发挥作用?
我认为它与控件的ViewState有某种关系,但它对我没有多大意义,因为即使我在Page_Load事件中添加控件,我也不能在container.AddControl()方法之后设置任何属性为了使ViewState能够赶上页面生命周期,CheckedChanged事件仍然会被触发。感谢
答案 0 :(得分:1)
您最迟需要在页面的加载事件中的每个回发上重新创建动态创建的控件。
需要触发事件并正确加载ViewState,否则回发数据会丢失,您将永远不会看到任何更改(fe CheckBox
的Checked-state或{{1}的Text属性})。
您可以在事件处理程序中动态创建控件(晚于page_load)。但是您最迟需要在页面加载中重新创建(在page_init中更好)。