如何访问特定控制在ASP.Net直放站

问题描述:

介绍如何访问特定控制在ASP.Net直放站

我在大学项目,我需要建立一个购物网站的工作。

我目前正在建设一个“管理购物车”页面的结构如下: enter image description here

什么是我的问题重要的是“产品”。 “产品”是仅使用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属性只是“数量”。

现在我有点卡住了。

enter image description here

我是什么用?

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

使用ASP的控制,而不是简单的HTML。 – AsifAli72090

+0

@Asif.Ali我正在使用ASP Controls ... OP中的最后一张图片是chrome开发人员工具中呈现页面的屏幕截图。 – Tyler

+0

你的问题是保存按钮点击事件访问文本框? – AsifAli72090

要想从文本框的文本在您的保存按钮点击使用以下代码:

// 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) 
+0

正如我在我的OP中提到的,我有多个TextBoxs,我需要从中获取文本。每个产品有1个数量的文本框。使用您提供的代码只会得到第一个文本框。第二个产品的“保存”按钮必须访问第二个产品的“数量”,而不是第一个产品的“数量”,PS - 抱歉等待,班级再次开始。我只有在下一个时期开始前10分钟。 – Tyler

+0

如果您的文本框是内置中继器,那么这将工作正常,因为您需要多个文本框在中继器。 – AsifAli72090

+0

哦...所以RepeaterItem基本上可以在幕后处理设置动态ID。它似乎工作得很好。谢谢! – Tyler