【发布时间】:2012-03-21 22:52:16
【问题描述】:
我最近在 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 属性上触发总是假的,因为它永远不会被设置。我使用的复选框不会导致 AutoPostBack。
为什么会发生这种情况,我怎样才能让它每次都正常工作?
我认为它在某种程度上与控件的 ViewState 相关,但这对我来说没有多大意义,因为即使我在 Page_Load 事件中添加控件,我也没有在 container.AddControl() 方法之后设置任何属性为了让 ViewState 赶上页面生命周期,仍然会触发 CheckedChanged 事件。谢谢
【问题讨论】:
-
您是否最迟在页面加载事件的每次回发时通过
Page.LoadControl重新创建用户控件? -
我创建了像 Control pc = LoadControl("PrinterControlSearch.ascx"); 这样的控件((PrinterControlSearch)pc).printer = 打印机; ((PrinterControlSearch)pc).displayPrinter(); liPrinterResult.Controls.Add(pc);打印机控件。添加((打印机控件搜索)pc);打印机列表.Controls.Add(liPrinterResult);如果我在页面加载中使用它是可以的,如果我在任何其他方法中使用它,来自用户控件的复选框中的 CheckedChanged 事件永远不会被触发。
-
是的,您最迟需要在页面加载事件中的每个回发上重新创建动态创建的控件。 stackoverflow.com/questions/9514548/…
-
我可以看到。这仅仅是事件的必要条件吗?因为即使我不在页面加载中重新创建控件,控件也会正确显示在页面上,只有事件不会触发。
-
正确加载 ViewState 也是必需的,否则回发数据会丢失,您将永远看不到任何更改(例如 CheckBox 的 Checked 状态或 TextBox 的 Text 属性)。我不确定你是否误解了我。您可以在事件处理程序中动态创建控件(晚于 page_load)。但是您需要最晚在页面加载时重新创建它们(在 page_init 中更好)!
标签: asp.net events webusercontrol