如何访问 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".
现在我有点卡住了。
我在用什么?
- Visual Studio 2017
- .NET Framework 4.6.1
- 2 层 WebForms 项目
- GoogleChrome
要从保存按钮中的文本框中获取文本,请单击使用以下代码:
// 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)
简介
我正在做一个大学项目,我需要建立一个购物网站。
我目前正在构建具有以下结构的 "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".
现在我有点卡住了。
我在用什么?
- Visual Studio 2017
- .NET Framework 4.6.1
- 2 层 WebForms 项目
- GoogleChrome
要从保存按钮中的文本框中获取文本,请单击使用以下代码:
// 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)