【问题标题】:Get specific item from Repeater in code behind在后面的代码中从中继器获取特定项目
【发布时间】:2016-04-18 12:47:10
【问题描述】:

我有一个 ASP.NET WebForms 项目,它显示通过中继器从数据库读取的数据。中继器的代码如下所示:

<asp:Repeater ID="repRMAproduct" runat="server">
     <ItemTemplate>
          <tr>
               <td>
                    <%# Eval("Description") %>
               </td>
               <td>
                    <%#  Eval("Qty") %>
               </td>
               <td>
                    <asp:TextBox ID="tbNewQty" runat="server"></asp:TextBox>
               </td>
          </tr>
     </ItemTemplate>
</asp:Repeater>

我想要的是用户只在他想输入的行上输入一个新的数量。然后,当他单击保存按钮时,我可以读取这些新数量及其相关描述。

在 MVC 中,我应该使用 jQuery 构建 URL 并将其传递给控制器​​。但在 WebForms 中,它似乎不太直观。我从这里去哪里?

【问题讨论】:

  • 如何确定修改了什么值?如果文本框不为空或者它的值为!= Eval("Qty")?
  • 未修改值的 tbNewQty 为空。同样,如果我在 jQuery 中构建 URL,我可以自己检查。

标签: c# asp.net .net webforms


【解决方案1】:

在您的保存按钮单击事件处理程序中,您可以循环所有项目并使用FindControl 获取TextBox

foreach(RepeaterItem item in repRMAproduct.Items)
{
    TextBox tbNewQty = (TextBox) item.FindControl("tbNewQty");
    string newQuantity = tbNewQty.Text.Trim();
    int quantity;
    if(int.TryParse(newQuantity, out quantity))
    {
        SaveNewRmaQuantity(product, quantity);
    };
}

如果您使用Label 作为产品描述,您可以使用FindControl("LblDescriptionId") 来获取它并将Text 传递给SaveNewRmaQuantity。你也可以使用不可见的控件(Visible=false), f.e. a Label, 来存储ProductId

【讨论】:

  • 感谢您的回复。我尝试了您的代码,并且在编译时它告诉我 ItemRepeater(“repRMAproduct”)不包含任何项目,即使我通过查看前端知道它确实如此。有什么想法吗?
  • 在点击事件中。我应该在其他地方调用它吗?
  • @MSOACC:我猜你在每次回发时都会对转发器进行 DataBind,例如在Page_Load 中。使用if(! IsPostBack){ DataBindRepeater(); }。否则,如果没有更多代码,就很难找到问题的原因。
  • 我对每个 PostBack 进行数据绑定。为什么这是个问题?
  • @MSOACC:因为转发器中的所有更改都丢失了,它将使用数据库值重新创建。此外,不会触发中继器或其中的控件的任何事件。启用 ViewState 后无论如何都不需要它。
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多