如何访问特定控制在ASP.Net直放站
我在大学项目,我需要建立一个购物网站的工作。
什么是我的问题重要的是“产品”。 “产品”是仅使用ItemTemplate
控件的ASP.Net转发器。然后中继器在用户的购物车中填充产品列表。
我的问题是什么?
我遇到的特定区域是“保存”按钮。 用户可以更改他们想要的每种产品的数量;但是,他们必须单击“保存”按钮才能将信息发送到数据库。
问题是我的保存按钮的onclick事件中访问正确的数量文本框。
如何在我的所有保存按钮的OnClick事件中访问正确的文本框?
我试过了什么?
我最初是想用WebControl.FindControl方法。 当然,FindControl需要一个ID,我需要为每个文本框使用不同的ID。
为了这个ID的问题,我试图修复...
首先...
试图结合产品ID的文本框的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事件动态设置文本框 “QUANTITYX”,其中X是产品ID的ID尝试。
我所做的是在产品ID绑定到一个WebControl的属性:
<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' />
在此之后,我然后使用FindControl()
方法来获取与“量”的ID TextBoxs。找到文本框后,我将采用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个差异。我使用直放站的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;
在你的第三个方法your're只检查DataItems但你必须检查它AlternatingItems也:
if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem)
正如我在我的OP中提到的,我有多个TextBoxs,我需要从中获取文本。每个产品有1个数量的文本框。使用您提供的代码只会得到第一个文本框。第二个产品的“保存”按钮必须访问第二个产品的“数量”,而不是第一个产品的“数量”,PS - 抱歉等待,班级再次开始。我只有在下一个时期开始前10分钟。 – Tyler
如果您的文本框是内置中继器,那么这将工作正常,因为您需要多个文本框在中继器。 – AsifAli72090
哦...所以RepeaterItem基本上可以在幕后处理设置动态ID。它似乎工作得很好。谢谢! – Tyler
使用ASP的控制,而不是简单的HTML。 – AsifAli72090
@Asif.Ali我正在使用ASP Controls ... OP中的最后一张图片是chrome开发人员工具中呈现页面的屏幕截图。 – Tyler
你的问题是保存按钮点击事件访问文本框? – AsifAli72090