【问题标题】:Two Buttons updating one item of a listview两个按钮更新列表视图的一项
【发布时间】:2013-07-10 09:13:57
【问题描述】:

我在 ListView 中有两个按钮。单击第一个按钮,我想更新 ListView-Item。单击第二个按钮,我想更新 ListView-Item 并重定向到不同的页面。两个按钮都有一个属性CommandName="Update"。我想用CommandArgument-Property 和OnItemUpdated-Event 解决我的问题,但我不知道如何在事件中获取此Property 的值。

<asp:ObjectDataSource ID="ods" runat="server" SelectMethod="Select" UpdateMethod="Update">
    <SelectParameters>
        <asp:Parameter ..... />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameters .... />
    </UpdateParameters>
</asp:ObjectDataSource>  

<asp:ListView ID="lv" runat="server" DataSourceID="ods" DataKeyNames="ID" OnItemUpdated="lv_OnItemUpdated">
    <ItemTemplate>...</ItemTemplate>  
    <EditItemTemplate>
        <asp:Button ID="btnUpdate" runat="server" CommandName="Update"/>
        <asp:Button ID="btnUpdate2" runat="server" CommandName="Update"/> 
    </EditItemTemplate>
</asp:ListView>

在代码隐藏中:

protected void lv_OnItemUpdated(object sender, ListViewUpdateEventArgs e)
{
    ...
}  

是否可以在 lv_OnItemUpdated 中决定用户点击了哪个 Button?

【问题讨论】:

    标签: asp.net listview


    【解决方案1】:

    我不相信有办法区分哪个控件发出了更新命令,因为发件人是ListView 本身。

    一种解决方法是为一个按钮提供 CommandName“Update”,另一个为“UpdateRedirect”。 “UpdateRedirect”按钮将触发ListView_ItemCommand 事件,您可以从那里调用ListView.UpdateItem,将更新逻辑保留在其中,然后进行下一步重定向。

    你为什么坚持使用OnItemUpdated事件?

    【讨论】:

      【解决方案2】:

      嗯,有 2 到 3 种方法:一种是 CommandArgument 为:

      <asp:Button id="Button1"
         Text="Sort Ascending"
         CommandName="Sort"
         CommandArgument="Ascending"
         OnCommand="CommandBtn_Click" 
         runat="server"/>
       <asp:Button id="Button2"
         Text="Sort Descending"
         CommandName="Sort"
         CommandArgument="Descending"
         OnCommand="CommandBtn_Click" 
         runat="server"/>
      

      在服务器端你可以拥有:

      void CommandBtn_Click(Object sender, CommandEventArgs e) 
      {
          if(e.CommandName == "Sort")
          //do you work and so on
      }
      

      或者您可以将发件人转换为按钮并获取它的 ID 来查看它是哪个按钮:

      ((Button)sender)).ID
      

      或者您可以将按钮 ID 设为:

      String ButtonID = Request["__EVENTTARGET"];
      

      希望它能帮助您解决问题。

      所以你可以喜欢:

      protected void lv_OnItemUpdated(object sender, ListViewUpdateEventArgs e)
      {
          // either use e.CommandName
          // or user ((Button)sender)).ID
      }
      

      【讨论】:

      • 谢谢,但如果可能的话,我想使用 OnItemUpdated-Event。
      • 我已经修改了我的答案,最后你可以找到你的解决方案。
      • CommandName 是“Update”,sender 是 ListView 而不是 Button。
      • 他的问题是CommandArgument不是ListViewUpdatedEventArgs的成员。
      【解决方案3】:

      给每个按钮一个不同的名称。在处理两个按钮单击事件的代码中使用相同的事件处理方法。然后检查哪个按钮调用了该方法。

      编辑: 一种解决方法是使用 javascript 将单击按钮的名称放入表单上的隐藏字段中,然后再进入服务器端(使用客户端脚本)。然后在您的 Listview 中,您可以检查隐藏字段的值以查看单击了哪个按钮。

      【讨论】:

      • 我希望按钮触发 ListView 的更新事件。当我处理按钮单击事件时,更新不起作用。
      • 所以你想让页面显示 ListView 中的更改然后重定向?
      • 显示更改不是必需的,但需要更新(将更新写入数据库)。当我处理 OnClick-Event 时,更新不起作用。
      • 请提供更多信息(在您的开篇文章中)您所说的“更新不起作用”是什么意思。请出示您的代码,以便我们尝试提供更多帮助。
      • 更新正在工作,但是当我使用 ItemUpdating 和 ItemUpdated 时,不会触发按钮的 OnClick 事件。
      【解决方案4】:

      好的,是的,itemcommand 就是你想要的: 更新或插入的生命周期会触发它们的原生事件和 itemcommand 事件。 itemCommand 事件将在 itemUpdating 或 itemInserting 事件之前发生。 因此,您可以创建一个名为“bSecondButtonClicked”的布尔变量,例如使用 Commandname='UPDATE" 将命令参数添加到两个按钮。可以在 itemcommand 事件点评估 e.command 参数。设置您的布尔变量 (或者你实现它)为真。然后,在 itemupdating 事件中,根据 bSecondButtonClicked 触发你的代码。

      【讨论】:

        【解决方案5】:

        您需要进入ListViewItemCommand 事件

        protected void lstvw_ItemCommand(object sender, ListViewCommandEventArgs e)
            {
                switch (e.CommandName)
                {
                    case "new":
                        try
                        {
                            //e.CommandArgument
                            //e.CommandSource
                            // do your stuff here
                        }
                        catch (Exception ex)
                        {
        
                        }
                        break;
        
                    default:
                        break;
                }
            }
        

        【讨论】:

        • 谢谢,但如果可能的话,我想使用 OnItemUpdated-Event。
        • 您要求解决方案,这可以完成工作,现在是优先事项。我只是想给出一个解决方案。如果它有效,则标记为答案。
        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多