【问题标题】:How to access specific controls in a ASP.Net Repeater如何访问 ASP.Net 中继器中的特定控件
【发布时间】:2017-10-17 16:28:37
【问题描述】:

简介

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

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

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

我的问题是什么?

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

问题是在我的保存按钮的 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 时,您必须使用“简单 ID”(例如:“button1”)。据说我可以在代码隐藏中设置 ID。

其次...

然后我尝试使用中继器的 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 为“数量”的文本框。找到 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 个差异。我使用了中继器的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 最大的产品被跳过。 (例如,如果我有产品 4、32 和 68。68 的产品 ID 将被跳过)

如下图所示,我们有 3 种产品。我在图片上编辑了一些文本,以清楚地指出文本框(在渲染时)。

存在的 ID 是 1、32 和 34。如果您查看 1 和 32 的 ID 属性,您会看到它们有“数量”以及附加的产品 ID。

现在看34的ID属性,ID属性只有“数量”。

现在我有点卡住了。

我在用什么?

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

【问题讨论】:

  • 使用 asp 控件而不是简单的 html。
  • @Asif.Ali 我正在使用 ASP 控件... OP 中的最后一张图片是 chrome 开发者工具中渲染页面的屏幕截图。
  • 您的问题是在保存按钮单击事件时访问文本框?

标签: c# asp.net webforms asprepeater


【解决方案1】:

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

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

【讨论】:

  • 正如我在 OP 中提到的,我有多个文本框需要从中获取文本。每个产品有 1 个数量文本框。使用您提供的代码只会获得第一个要呈现的文本框。第二个产品的“保存”按钮必须访问第二个产品的“数量”,而不是第一个产品的“数量”,PS - 久等了,课程又开始了。下一个周期开始前我只有 10 分钟的时间。
  • 如果您的文本框在转发器中,那么这将正常工作,因为您需要多个文本框在转发器中。
  • 哦...所以RepeaterItem 基本上在后台处理设置动态ID。它似乎工作得很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2010-10-29
相关资源
最近更新 更多