如何将值传递给 ListView 中按钮的单击处理程序?

How do I pass a value to a button's click handler in a ListView?

在我的页面上,我显示了一些来自数据库的数据,每个项目都有用于将其从数据库中删除的按钮。

这是 aspx:

 <asp:ListView ID="productList" runat="server"
                DataKeyNames="id_produkt"
                ItemType="Shop.Models.Produkt" SelectMethod="GetProducts">
                <ItemTemplate>
                    <tr>
                        <td><%#:Item.id_produkt%></td>
                        <td><%#:Item.nazwa_produkt%></td>
                        <td><%#:Item.cena%></td>
                        <td><%#:Item.poprzednia_cena%></td>
                        <td><%#:Item.Ilosc%></td>
                        <td>
                            <asp:Button CssClass="btn btn-info btn-sm" ID="Edytuj" runat="server" Text="Edytuj" OnClick="AddProductButton_Click" CausesValidation="true" />
                            <asp:Button CssClass="btn btn-danger btn-sm" ID="RemoveButton" runat="server" Text="Usuń Produkt" OnClick="RemoveProductButton_Click" CausesValidation="false" />
                            <a href="AdminPage_Details.aspx?productID=<%#:Item.id_produkt%>" class="btn btn-info btn-sm">Szczegóły</a>
                        </td>
                    </tr>
                </ItemTemplate>
                <ItemSeparatorTemplate></ItemSeparatorTemplate>
            </asp:ListView>

如何在代码隐藏方法中获得 Item.id_produkt?

现在看起来像这样:

protected void RemoveProductButton_Click(object sender, EventArgs e)
        {
            using (var _db = new Shop.Models.EgzemplarzContext())
            {
                int productId = Convert.ToInt16();
                var myItem = (from c in _db.Produkty where c.id_produkt == productId select c).FirstOrDefault();

                IQueryable<Egzemplarz> query = _db.Egzemplarze;
                query = query.Where(p => p.id_produkt == productId);

                if (myItem != null && query != null)
                {
                    foreach ( var item in query)
                    {
                        _db.Egzemplarze.Remove(item);
                    }

                    _db.Produkty.Remove(myItem);
                    _db.SaveChanges();

                    // Reload the page.
                    string pageUrl = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.Count() - Request.Url.Query.Count());
                    Response.Redirect(pageUrl + "?ProductAction=remove");
                }
                else
                {
                    LabelAddStatusDanger.Text = "Nie można usunąć produktu.";
                }
            }
        }

我需要用这种方法从产品列表中获取 Item.id_produkt。

我该怎么做?

使用按钮的 CommandArgument 属性 传递它。

标记:

<asp:Button ID="RemoveButton"
            runat="server"
            Text="Usuń Produkt"
            OnClick="RemoveProductButton_Click"
            CommandArgument='<%#:Item.id_produkt%>' />

后面的代码:

protected void RemoveProductButton_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    var id_produkt = button.CommandArgument;
}

这会将 ListView 中按钮的 CommandArgument 设置为具有所需的产品 ID。然后当点击事件处理程序被获取时,发送者将是你的按钮。我们需要将其转换为按钮类型才能访问 CommandArgument 属性.