Asp.net Web用户控件属性和事件触发器

Asp.net Web用户控件属性和事件触发器,asp.net,events,webusercontrol,Asp.net,Events,Webusercontrol,我最近在asp.net中创建了一个表示打印机的web用户控件。用户控件包含一个复选框,用于设置IsChecked属性: 已检查受保护区域; /// ///是否选择了打印机 /// 公共场所被检查 { 获取{return isChecked;} 设置{isChecked=value;} } 受保护的无效CHU CheckedChanged(对象发送方,事件参数e) { 如果(已检查) { isChecked=false; } 其他的 { isChecked=true; } } 我希望能够使用

我最近在asp.net中创建了一个表示打印机的web用户控件。用户控件包含一个复选框,用于设置IsChecked属性:

已检查受保护区域;
/// 
///是否选择了打印机
/// 
公共场所被检查
{
获取{return isChecked;}
设置{isChecked=value;}
}
受保护的无效CHU CheckedChanged(对象发送方,事件参数e)
{
如果(已检查)
{
isChecked=false;
}
其他的
{
isChecked=true;
}
}
我希望能够使用复选框(multiselection)选择打印机,并使用“添加选定”按钮添加选定的“打印机(用户控件)”

protectedvoid btnSubmitSelection\u单击(对象发送方,事件参数e)
{
Dictionary addResults=新字典();
foreach(PrinterControl在PrinterControl中搜索pctrl)
{
如果(pctrl.已检查)
{
addResults.Add(pctrl.printer.PrinterName,PrinterOperations.addPrinter(客户端,pctrl.printer));
}
}
}
如果我在Page_Init或Page_Load事件中添加web用户控件,所有这些都可以正常工作。从主页中的AddSelected按钮触发回发后,每个选中控件的CheckedChanged事件都会逐个触发,并且IsChecked属性设置为选中复选框的应有属性

但是,如果使用由搜索按钮的回发触发的方法将web用户控件添加到页面,则控件显示为ok,但CheckedChanged事件不会在AddSelected回发上触发,IsChecked属性始终为false,因为它从未设置。我使用的复选框不会导致自动回发

为什么会发生这种情况?我怎样才能让它每次都起作用


我认为它与控件的ViewState有某种关系,但这对我来说没有多大意义,因为即使我在Page_Load事件中添加控件,我也不会在container.AddControl()方法之后设置任何属性,以便ViewState跟上页面生命周期,并且CheckedChanged事件仍然会被触发。谢谢

您最迟需要在页面加载事件中的每次回发上重新创建动态创建的控件

这是触发事件和正确加载ViewState所必需的,否则回发数据将丢失,并且您将永远看不到任何更改(例如,
复选框的选中状态或
文本框的文本属性)

可以在事件处理程序中动态创建控件(晚于页面加载)。但您最迟需要在页面加载中重新创建它们(最好在页面初始化中)


您是否最迟在页面的加载事件中的每次回发上都通过
页面.LoadControl
重新创建用户控件?我创建控件,如Control pc=LoadControl(“PrinterControlSearch.ascx”);((PrinterControlSearch)pc)。打印机=打印机;((PrinterControl搜索)pc.displayPrinter();liPrinterResult.Controls.Add(pc);PrinterControl.Add((PrinterControl搜索)pc);printersList.Controls.Add(liPrinterResult);如果我在页面加载中使用此选项,如果我在任何其他方法中使用此选项,则不会触发带有用户控件的复选框中的CheckedChanged事件。是的,您最迟需要在页面加载事件中的每次回发上重新创建动态创建的控件。我看得出来。这仅仅是活动所必需的吗?因为即使我没有在页面加载中重新创建控件,控件也会正确显示在页面上,只有事件不会触发。还需要正确加载ViewState,否则回发数据将丢失,您将永远看不到任何更改(例如复选框的选中状态或文本框的文本属性)。我不确定你是否误解了我。您可以在事件处理程序中动态创建控件(晚于页面加载)。但您最迟需要在页面加载中重新创建它们(在页面初始化中更好)!