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