C# Asp.Net按钮在UpdatePanel内的Repeater内单击事件
我试图在Updatepanel中使用一个转发器,并使用按钮删除数据库中的一个条目,获取转发器的新数据并更新面板。我尝试了一个链接按钮,但它总是回发和页面重新编码。然后我尝试了一个常规按钮,并在DataBound事件上为该按钮创建了一个事件。但它不起作用。代码如下: aspx文件:C# Asp.Net按钮在UpdatePanel内的Repeater内单击事件,c#,asp.net,events,updatepanel,repeater,C#,Asp.net,Events,Updatepanel,Repeater,我试图在Updatepanel中使用一个转发器,并使用按钮删除数据库中的一个条目,获取转发器的新数据并更新面板。我尝试了一个链接按钮,但它总是回发和页面重新编码。然后我尝试了一个常规按钮,并在DataBound事件上为该按钮创建了一个事件。但它不起作用。代码如下: aspx文件: <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel runat="server" id="Pa
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel runat="server" id="Panel">
<ContentTemplate>
<table cellpadding="0" cellspacing="0" id="saveTable">
<tr style="font-weight: bold;">
<td>Erstellt am</td>
<td>Anforderer</td>
<td>Werk</td>
<td>Gebäude</td>
<td>Start Datum</td>
<td>Löschen</td>
<td>Benutzen</td>
</tr>
<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
<ItemTemplate>
<tr id="Meldung<%# DataBinder.Eval(Container.DataItem,"meldungId")%>">
<td><%# DataBinder.Eval(Container.DataItem, "timestamp").ToString().Substring(0, 10)%></td>
<td><%# DataBinder.Eval(Container.DataItem,"nameAnforderer") %></td>
<td><%# DataBinder.Eval(Container.DataItem,"Werk") %></td>
<td><%# DataBinder.Eval(Container.DataItem,"Building") %></td>
<td><%# DataBinder.Eval(Container.DataItem,"startDatum").ToString().Substring(0, 10) %></td>
<td>
<asp:Button runat="server" ID="test"/>
</td>
<td></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</ContentTemplate>
</asp:UpdatePanel>
这样做的目的是将文本和ID像这样传递给每个按钮。但是这些按钮没有调用deleteMeldung()的Click事件。我倾向于在中继器外部有一个单独的删除按钮(通常是样式设置为“display:none”的asp:button以及一个隐藏字段。让我们调用这些B\u delete和HF\u DeleteId 中继器内部的按钮本身不会导致回发,但它们只会将给定行的ID设置为隐藏字段HF#U DeleteId,然后调用$(“#B#U Delete”)。单击()(其中B#U Delete应替换为按钮的当前ClientID)。然后在服务器方法B_Delete_单击,您可以从隐藏字段中检索要删除的行的ID。使用更新面板没有问题。无需处理触发器和处理动态生成按钮中的事件 可能是这样的:
<asp:UpdatePanel runat="server" ID="UP_Rptr" UpdateMode="Conditional">
<ContentTemplate>
<asp:Repeater runat="server" ID="RPTR_DeleteTest" EnableViewState="False" OnItemDataBound="RPTR_DeleteTest_ItemDataBound">
<ItemTemplate>
<div>
<span><%# Eval("ID") %></span>
<span><%# Eval("Name") %></span>
<span><asp:LinkButton runat="server" ID="LB_Delete" Text="delete"></asp:LinkButton></span>
</div>
</ItemTemplate>
</asp:Repeater>
<asp:HiddenField runat="server" ID="HF_DeleteId" />
<asp:Button runat="server" ID="B_Delete" OnClick="B_Delete_Click" Style="display:none;" />
</ContentTemplate>
</asp:UpdatePanel>
我尝试了Pafkas解决方案,效果很好,谢谢。但是,我被告知,如果有任何其他方法可以解决此问题,我找到了另一个解决方案,我向ScriptManager注册了每个链接按钮,如下所示:
btn1.Click += new EventHandler((sender1, e1) => deleteMeldung(sender1, e1, meldungId));
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null) {
scriptManager.RegisterAsyncPostBackControl(btn1);
}
使用此链接按钮:
<asp:LinkButton runat="server" ID="test"/>
它成功了,它在不重新编码的情况下启动了deleteMeldung方法,并传递了参数meldungId以删除Entrie,并将新数据更新到UpdatePanel,您可以使用:因此不会重新加载页面。使用此方法,您可以使用linkbutton。这项工作做得很好。这种方法是可行的,但是在我看来,它有一个缺点。为了触发动态按钮,你必须重建所有控件(即中继器)与回发之前一样。这意味着让中继器使用viewstate,或者在每次回发时从数据库加载数据。然后在处理事件后,通常必须再次绑定重新绘制以反映更改。这没什么大不了的——但如果有办法避免,可能更好。
btn1.Click += new EventHandler((sender1, e1) => deleteMeldung(sender1, e1, meldungId));
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null) {
scriptManager.RegisterAsyncPostBackControl(btn1);
}
<asp:LinkButton runat="server" ID="test"/>