【问题标题】:Asp.Net Button click Event inside Repeater inside UpdatePanelAsp.Net按钮单击UpdatePanel内Repeater内的事件
【发布时间】:2014-09-22 10:03:47
【问题描述】:

我正在尝试在更新面板中使用中继器,并使用按钮删除数据库中的一个条目并获取中继器的新数据并更新面板。我尝试了一个 LinkBut​​ton,但它总是回发并且页面重新加载。然后我尝试了一个常规按钮并在 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 = 测试一个事件

    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";

    }

所以工作就是将文本和 ID 传递给每个按钮。但是按钮没有点击事件来调用 deleteMeldung()

【问题讨论】:

  • 你可以使用: 所以它不会重新加载你的页面..你可以使用这个链接按钮..

标签: c# asp.net events updatepanel repeater


【解决方案1】:

我倾向于在中继器之外有一个单独的删除按钮(这通常是 asp:Button,样式设置为 '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
}

【讨论】:

    【解决方案2】:

    我尝试了 Pafkas 解决方案,它奏效了,谢谢。但是,如果有任何其他方法可以解决此问题,我很感兴趣,我找到了另一种解决方案,我使用 ScriptManager 注册了每个 LinkBut​​ton:

            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 来删除企业并将新数据更新到 UpdatePanel

    【讨论】:

    • 干得好。这种方法是可行的,但在我看来它有一个缺点。为了触发动态按钮的事件,您必须重建所有控件(即转发器),就像它们在回发之前一样。这意味着要么让转发器使用视图状态,要么在每次回发时从数据库加载数据。然后在处理完事件后,通常必须再次绑定 repater 以反映更改。没什么大不了的——但如果有办法避免这种情况,恕我直言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多