当行内按钮被点击时获取ListView项目

5
我有一个创建表格的 ListView,每行表格都有两个按钮 - 删除和修改。我为每个按钮触发了点击事件,但我不知道如何获取被点击的按钮所在行中的数据。

aspx

<asp:ListView runat="server" ID="usersListView">
    <LayoutTemplate>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>User Name</th>
                    <th>Email</th>
                    <th>Role</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <asp:PlaceHolder runat="server" ID="groupPlaceHolder"/>
            </tbody>
        </table>
    </LayoutTemplate>
    <GroupTemplate>
        <tr>
            <asp:PlaceHolder runat="server" ID="itemPlaceHolder"/>
        </tr>
    </GroupTemplate>
    <ItemTemplate>
        <td><%# Eval("user.UserName") %></td>
        <td><%# Eval("user.Email") %></td>
        <td><%# Eval("roles") %></td>
        <td>
            <button runat="server" id="modify" class="btn btn-mini" title="Modify" onclick="modify_OnClick">
                <i class="icon-edit"></i>
            </button>&nbsp;
            <button runat="server" id="delete" class="btn btn-mini" title="Delete" onclick="delete_OnClick">
                <i class="icon-trash"></i>
            </button>
        </td>
    </ItemTemplate>
</asp:ListView>

aspx.cs

public void delete_Onclick(object sender, EventArgs e) {

}

public void modify_Onclick(object sender, EventArgs e) {

}
3个回答

11

我将尝试回答标题中的问题,因为我不理解问题本身。

你可以将 sender 强制转换为 Button。Button 的 NamingContainerListViewItem。你可以使用它来通过 item.FindControl("OtherControlID") 获取该项中的所有其他控件。

例如;

public void delete_Onclick(object sender, EventArgs e) {
    var btn = (Button)sender;
    var item = (ListViewItem)btn.NamingContainer;
    // find other controls:
    var btnModify = (Button)item.FindControl("modify");
}

您无法在非服务器控件中查找文本。但是您可以使用LiteralControlLabel来显示用户名或电子邮件。

<td><asp:Label id="Label1" runat="server"
          Text='<%# Eval("user.UserName") %>' />
</td> 

现在你可以使用如上所示的 FindControl 在代码后端获取标签的引用。


我已经有了item,那么我不应该能够获取所选行的“用户名”列吗? - bflemi3
您无法在服务器控件之外找到文本。但是您可以使用LiteralControl或Label来代替。已编辑我的回答。 - Tim Schmelter
我能不能只是在 td 中添加一个 runat="server",然后通过这种方式访问它呢? - bflemi3
@bflemi3:是的,无论是 runat="server" 和 ID应该都能用,我认为你可以将其转换为 HtmlTableCell 并使用 InnerText - Tim Schmelter

1

我知道两种解决方案:


1-以下是命令名称和命令参数


2-您可以使用链接而不是按钮,并将包含记录ID的查询字符串发送到相同的页面上,并在代码后台(页面加载)中获取查询字符串,用于删除SQL命令或重定向到另一个页面进行编辑,最后再次使用Response.Redirect()返回到相同的页面。


0

由于数据是表格形式的,您应该使用GridView。无论如何,您可以实现ItemCommand事件。MSDN页面有一个示例

您可以自定义Button控件的CommandName和CommandArgument属性。 CommandArgument可以包含一些ID或相关信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接