C# 如何访问ASP.Net中继器中的特定控件

C# 如何访问ASP.Net中继器中的特定控件,c#,asp.net,webforms,asprepeater,C#,Asp.net,Webforms,Asprepeater,导言 我正在做一个大学项目,我需要建立一个购物网站 我目前正在构建一个具有以下结构的“管理购物车”页面: 对我的问题来说,重要的是“产品”。“产品”是一个ASP.Net中继器,它只使用ItemTemplate控件。然后用用户购物车中的产品列表填充中继器 我有什么问题? 我遇到问题的地方是“保存”按钮。 用户可以更改他们想要的每种产品的数量;但是,他们必须单击“保存”按钮才能将信息转到数据库 问题在于访问我的保存按钮的onclick事件中的correctquantity文本框 如何访问所有保存按

导言

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

我目前正在构建一个具有以下结构的“管理购物车”页面:

对我的问题来说,重要的是“产品”。“产品”是一个ASP.Net中继器,它只使用
ItemTemplate
控件。然后用用户购物车中的产品列表填充中继器

我有什么问题?

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

问题在于访问我的保存按钮的onclick事件中的correctquantity文本框

如何访问所有保存按钮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") %>' />
然后我发现productId属性没有值;因为,数据绑定尚未发生。换句话说,
Eval(“productId”)
没有运行

第三…

我采用了与之前相同的方法,但有一点不同。我使用了中继器的
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属性,您将看到它们附加了产品ID的“数量”

现在看看34的ID属性。ID属性仅为“数量”

现在我有点困了

我在用什么?

  • Visual Studio 2017
  • .NET Framework 4.6.1
  • 2层WebForms项目
  • 谷歌浏览器

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

// 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;
在第三种方法中,您只需检查数据项,但您还必须检查交替项:

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

使用asp控件而不是简单的html。@Asif.Ali我正在使用asp控件。。。OP中的最后一个图像是chrome开发工具中呈现页面的屏幕截图。您的问题是在保存按钮单击事件中访问文本框?正如我在OP中提到的,我需要从多个文本框中获取文本。每个产品有一个数量文本框。使用提供的代码只能得到要呈现的第一个文本框。第二个产品的“保存”按钮必须访问第二个产品的“数量”,而不是第一个产品的“数量”,PS-抱歉等待,课程已重新开始。在下一个周期开始之前,我只有10分钟的时间。如果你的文本框在转发器中,那么这将很好,因为你需要多个文本框在转发器中。哦。。。因此RepeaterItem基本上负责在幕后设置动态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;
if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem)