如何访问 ASP.Net Repeater 中的特定控件

How to access specific controls in a ASP.Net Repeater

简介

我正在做一个大学项目,我需要建立一个购物网站。

我目前正在构建具有以下结构的 "Manage Shopping Cart" 页面:

对我的问题来说重要的是"products"。 "products" 是一个仅使用 ItemTemplate 控件的 ASP.Net 转发器。然后转发器会填充用户购物车中的产品列表。

我的问题是什么?

我遇到问题的特定区域是 "Save" 按钮。 用户可以更改他们想要的每种产品的数量;但是,他们必须单击 "Save" 按钮才能将信息转到数据库。

问题是在我的“保存”按钮的 onclick 事件中访问 正确 数量文本框。

如何在我的所有“保存”按钮的 OnClick 事件中访问正确的文本框?

我尝试了什么?

我最初想使用 WebControl.FindControl 方法。 当然,FindControl 需要一个 ID,我需要为每个文本框使用不同的 ID。

为了解决这个 ID 问题,我尝试了...

首先...

尝试将 productId 绑定到文本框 ID。

<asp:TextBox ID='quantity<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />

然后我发现这是不可能的;因为,这样设置ID时,必须使用"simple ids"(例如:"button1")。据说我可以在 code-behind 中设置 ID。

其次...

然后我尝试使用 Repeater 的 OnItemCreated 事件将 TextBox 的 ID 动态设置为 "quantityX",其中 X 是产品 ID。

我所做的是将 productId 绑定到 WebControl 属性中:

<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />

在此之后,我使用 FindControl() 方法获取 ID 为 "quantity" 的文本框。找到 TextBox 后,我将采用 productId 属性并将其值附加到 TextBox ID。

protected void productsList_ItemCreated(object sender, RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item)
    {
        TextBox quantity = (TextBox)e.Item.FindControl("quantity");
        quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
    }
}

然后我发现 productId 属性没有值;因为,DataBinding 还没有发生。换句话说,Eval("productId") 不是 运行。

第三...

我采用了与之前相同的方法,但有 1 个不同。我使用了 Repeater 的 OnItemDataBound 事件而不是 OnItemCreated 事件。

protected void productsList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item)
    {
        TextBox quantity = (TextBox)e.Item.FindControl("quantity");
        quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]);
    }
}

这部分奏效了;但是,有一个问题。跳过具有最大产品 ID 的产品。 (E.X,如果我有产品 4、32 和 68。产品 ID 68 将被跳过)

如下图所示,我们有 3 种产品。我编辑了图片中的一些文本以清楚地指出文本框(呈现时)。

存在的 ID 为 1、32 和 34。如果您查看 1 和 32 的 ID 属性,您会看到它们有 "quantity" 并附加了其产品 ID。

现在看34的ID属性,ID属性只有"quantity".

现在我有点卡住了。

我在用什么?

要从保存按钮中的文本框中获取文本,请单击使用以下代码:

// get item on where button is clicked
RepeaterItem item = (RepeaterItem)((Button) sender).NamingContainer;

// get correct textbox from the item
TextBox txtQuantity = (TextBox)item.FindControl("quantity");

string qtyText = txtQuantity.Text;

在您的第三种方法中,您只检查 DataItems,但您还必须在 AlternatingItems 上检查它:

if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem)