我在这里阅读了大部分帖子,但我无法弄清楚为什么“CheckedChanged”事件没有解雇。这是我的情况。
我正在使用Repeater从数据库中生成项目。每个ReapeaterItem都应该包含一个UpdatePanel,因为我必须更新UpdatePanel中的控件,并且不想重新加载整个页面。在这些动态生成的UpdatePanel中(每个RepeaterItem都有一个)我最多动态添加三个Checkbox(基于数据库)。这些复选框需要触发“CheckedChanged”事件,因为在某些情况下我想根据业务逻辑启用/禁用/检查/取消选中Checkbox1,2或3。 ...希望你到目前为止得到这个。我正在添加所有控件并添加了EventHandler。但生成的代码不反映事件处理程序。我尝试了OnItemDataBound,OnItemCreated,PreRender,...事件也添加了Eventhandler,但是我无法找到带有ID的CheckBox-Control。
我完全迷失了这个并且在使用Buttons而不是Checkboxes的路上。从我到目前为止读到的是,使用按钮我可以使用Button中的CommandName和来自Repeater的ItemCommand-Event来获得解决方法,但是我需要以某种方式反映页面上的“检查”。
不过,每个Repeater(8)都位于一个ajaxtoolkit-accordion控件内。我在这里给你一些代码:
ASPX页
<asp:Repeater ID="RepeaterAccordionPane2" runat="server">
<ItemTemplate>
HTML Stuff<%# DataBinder.Eval(Container.DataItem, "Header")%>HTML Stuff<%# DataBinder.Eval(Container.DataItem, "Beschreibung")%></td>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode=Conditional>
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
HTML Stuff
</ItemTemplate>
</asp:Repeater>
这是Page_Load Part
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dvAlleArtikel = new System.Data.DataView(...Database...);
[... some other code here ...]
RepeaterAccordionPane2.DataSource = dvAlleArtikel;
//RepeaterAccordionPane2.ItemCreated +=new RepeaterItemEventHandler(RepeaterAccordionPane2_ItemCreated);
//RepeaterAccordionPane2.PreRender +=new EventHandler(RepeaterAccordionPane2_PreRender);
RepeaterAccordionPane2.DataBind();
int nUpdatePanelIndex = 0;
foreach (Control crInRepeater in RepeaterAccordionPane2.Controls)
{
if (crInRepeater.GetType() == typeof(RepeaterItem))
{
foreach (Control crInRepeaterItem in crInRepeater.Controls)
{
if (crInRepeaterItem.GetType() == typeof(UpdatePanel))
{
LiteralControl litTabelleBeginn = new LiteralControl("<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">");
((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litTabelleBeginn);
if (dvAlleArtikel[nUpdatePanelIndex]["ArtNr1"].ToString() != "0")
{
CheckBox CheckBox1 = new CheckBox();
CheckBox1.ID = dvAlleArtikel[nUpdatePanelIndex]["ArtNr1"].ToString();
CheckBox1.Text = (dvAlleArtikel[nUpdatePanelIndex]["CheckBoxLbl1"].ToString() == "" ? "leer" : dvAlleArtikel[nUpdatePanelIndex]["CheckBoxLbl1"].ToString());
CheckBox1.AutoPostBack = true;
CheckBox1.CheckedChanged +=new EventHandler(CheckBox1_CheckedChanged);
LiteralControl litNeueTabellenZeileBeginn = new LiteralControl("<tr><td width=10><img src=\"images/helper/spacer.gif\" width=\"10\"></td><td height=\"20\">");
LiteralControl litNeueTabellenZeileEnde = new LiteralControl("</td><td width=\"100\" height=\"20\">" + dvAlleArtikel[nUpdatePanelIndex]["ArtPrice1"].ToString() + " € </td></tr>");
((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litNeueTabellenZeileBeginn);
((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(CheckBox1);
((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litNeueTabellenZeileEnde);
}
[... some other code here...]
LiteralControl litTabelleEnde = new LiteralControl("</table>");
((UpdatePanel)crInRepeaterItem).ContentTemplateContainer.Controls.Add(litTabelleEnde);
nUpdatePanelIndex++;
}
}
}
}
永远不会达到此代码:
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
int foo = 0;
}
这是生成的CheckBox代码:
<input id="AccordionPane2_content_RepeaterAccordionPane2_ctl00_6200" type="checkbox" name="AccordionPane2_content$RepeaterAccordionPane2$ctl00$6200" onclick="javascript:setTimeout('__doPostBack(\'AccordionPane2_content$RepeaterAccordionPane2$ctl00$6200\',\'\')', 0)" />
生成了事件,但是当我单击Checkbox时,UpdatePanel中的所有内容都消失了,并且没有触发CheckedChanged-EventHandler。
我做错了什么?
感谢所有的建议,我真的被卡住了。
MK
答案 0 :(得分:4)
第一次加载页面时,您将所有复选框添加到Controls集合中,然后呈现它们。当您进行回发(通过CheckBox的AutoPostBack)时,您有一个检查if(!IsPostBack)
,它不允许将复选框添加到回发的Controls集合中。因此,您将看不到控件和页面,并且当页面生命周期尝试调用事件(在Page_Load之后发生)时,创建事件的控件不再存在。
您需要重构您的Page_Load方法,以便它做两件事 - 1,无论IsPostBack
的值绑定转发器并创建动态控件。 2,如果是IsPostBack==false
,即初始加载,则设置动态控件的值。您不希望在IsPostBack==true
时设置动态控件的值,因为这样您将丢失用户输入的值。
另外,请注意:
if (crInRepeater.GetType() == typeof(RepeaterItem))
可以改写为:
if (crInRepeater is RepeaterItem)