我正在尝试在Updatepanel中使用Repeater并使用按钮删除数据库中的一个entery并获取Repeater的新数据并更新Panel。我尝试了一个LinkButton,但它总是回发并且页面重新开始。然后我尝试了一个常规按钮,并在DataBound事件上为该按钮创建一个事件。但它不起作用。这是代码:
aspx文件:
<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 = test事件的Button
protected void deleteMeldung(object sender, EventArgs e) {
System.Threading.Thread.Sleep(5000);
}
protected void Repeater1_ItemDataBound(object source, RepeaterItemEventArgs e) {
RepeaterItem repeaterSource = e.Item;
Button btn1 = repeaterSource.FindControl("test") as Button;
DataRowView drv = e.Item.DataItem as DataRowView;
string meldungId = drv.Row["meldungId"].ToString();
btn1.ID = "myNewButton"+meldungId;
btn1.Click += new EventHandler(deleteMeldung);
btn1.Text = "delete";
}
所以最新工作是将Text和ID传递给每个按钮。但是Buttons没有Click事件来调用deleteMeldung()
答案 0 :(得分:2)
我倾向于在转发器外部有一个单独的删除按钮(这通常是asp:按钮,样式设置为'display:none'以及隐藏字段。让我们称之为B_Delete和HF_DeleteId。
转发器内的按钮本身不会引起回发,但是它们只将给定行的ID设置为隐藏字段HF_DeleteId,然后调用$('#B_Delete')。click()(其中B_Delete应该被替换为按钮的当前ClientID)。然后在服务器方法B_Delete_Click中,您可以从隐藏字段中检索要删除的行的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>
服务器方法:
protected void RPTR_DeleteTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var lb = e.Item.Controls[1] as LinkButton; // for simplicity only - do not use code like this
lb.OnClientClick = String.Format("$('#{0}').val('{1}');$('#{2}').click();return false;",
HF_DeleteId.ClientID,
DataBinder.Eval(e.Item.DataItem, "ID"),
B_Delete.ClientID);
}
protected void B_Delete_Click(object sender, EventArgs e)
{
int id = Int32.Parse(HF_DeleteId.Value);
// do your sanity checks and deletion logic here
}
答案 1 :(得分:0)
我尝试了Pafkas解决方案并且它有效,谢谢你。但是,如果有任何其他方法可以解决这个问题并且我找到了另一种解决方案,我会被强制插入,我使用ScriptManager注册每个LinkButton:
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来删除enterie并将新数据更新到UpdatePanel