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

3

介绍

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

我目前正在构建一个"管理购物车"页面,其结构如下: enter image description here

对于我的问题来说,重要的是"产品"。 "产品"是使用ItemTemplate控件的ASP.Net Repeater。然后,该重复器通过用户购物车中的产品列表进行填充。

我的问题是什么?

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

问题是在我的保存按钮的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时,必须使用“简单ID”(例如:“button1”)。据说我可以在代码后台中设置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”的文本框。在找到文本框后,我会取productId属性并将其值附加到文本框的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属性没有值,因为数据绑定还没有发生。换句话说,Eval("productId")没有运行。
第三步...
我采用了与之前相同的方法,只有一个区别。我使用了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的产品被跳过了。(例如,如果我有产品4、32和68,那么产品ID为68的产品将被跳过)
如下图所示,我们有3个产品。我编辑了一些文本来清楚地指出TextBoxs(因为它们被呈现出来)。
存在的ID是1、32和34。如果您查看1和32的ID属性,您会发现它们都有“quantity”和它们的产品ID附加在后面。
现在看看34的ID属性。ID属性只有“quantity”。
现在我有点困惑。

enter image description here

我正在使用什么?

  • Visual Studio 2017
  • .NET Framework 4.6.1
  • 两层 WebForms 项目
  • Google Chrome

使用ASP控件而非简单的HTML。 - user1773603
@Asif.Ali 我正在使用ASP控件... OP中的最后一张图片是在Chrome开发者工具中呈现页面的截图。 - Tyler
你的问题是在保存按钮点击事件中访问文本框吗? - user1773603
1个回答

4
在保存按钮点击事件中获取文本框中的文本,请使用以下代码:
```javascript var textBoxValue = $('#textBoxId').val(); ```
其中,`#textBoxId` 是文本框的 ID。
// 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)

正如我在我的原始帖子中提到的那样,我有多个文本框需要获取文本。每个产品都有一个数量文本框。使用您提供的代码只会获取第一个呈现的文本框。第二个产品的“保存”按钮必须访问第二个产品的“数量”,而不是第一个产品的“数量”。PS-对不起让你等了这么久,课程已经开始了。我只有10分钟的时间才能开始下一节课。 - Tyler
如果您的文本框位于 Repeater 内,则此代码将按照您所需的方式正常工作,因为多个文本框位于 Repeater 中。 - user1773603
哦...所以RepeaterItem基本上在幕后处理设置动态ID。它似乎完美地工作着。谢谢! - Tyler

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