从代码隐藏中查找使用Repeater创建的标记中的控件值

时间:2012-03-14 14:50:37

标签: c# asp.net html user-controls

我想我可能在使用其他东西时使用了转发器,所以我已准备好将其用于设计,但我想在更改之前先咨询开发社区。

我还应该预先说明我在aspx页面的自定义用户控件中使用此转发器控件。

我的情况是,当用户选择项目时,我必须动态显示其他部分的列表。这类似于您在网上结账时有时会看到的“您可能也会感兴趣”列表。

因此,用户从下拉列表中选择要订购的商品,并且可以选择添加最多4个附加商品。

目前,我将可选部件列表带回到通用数据对象列表中,并将其绑定到转发器控件及其文本框。文本框基本上在一个框中列出了部分描述,并且用户可以选择在另一个文本框中键入他们想要该项目的数量。

一切都很好。

所以要明确的是,在转发器控件加载所有内容并呈现表单后,用户可以在数量文本框中键入值。

由于这一切都在用户控件中,我正在编写一种方法来收集所有这些信息,填充业务对象并将其返回到任何调用它。

我无法找到自动生成的文本框,因此我可以检索它们的值。

我有这种潜在的怀疑,我在设计中做了一些明显错误的事情。所以我想通过蜂巢头脑来看看别人的想法:)

这是我的转发器控件生成的标记。

<div class="base-container-controls-75pct">         
  <div class="base-container-controls-98pct">
    <div class="base-container-controls-75pct">
       <input name="DownLoadItem1$UxAdditionalParts$ctl01$UxItemNumber" type="text" id="DownLoadItem1_UxAdditionalParts_ctl01_UxItemNumber" class="textbox-readonly-xl" />
    </div>
    <div class="base-container-controls-10pct">
        <input name="DownLoadItem1$UxAdditionalParts$ctl01$UxQuantity" type="text" value="3" id="DownLoadItem1_UxAdditionalParts_ctl01_UxQuantity" class="textbox-md" />
    </div>  
  </div>

  ... more repeating code here, basically the 98pct div above is repeated for each "row" ...

</div>

1 个答案:

答案 0 :(得分:2)

在将一些东西拼凑在一起,阅读其他各种帖子之后,我基本上想出了这个。

我缺少的是我需要将[EnableViewState =“True”]添加到我的转发器的标记中。所以我的标记如下:

<asp:Repeater ID="UxAdditionalParts" runat="server" OnItemDataBound="UxAdditionalPartsItemDataBound" EnableViewState="True">
    <HeaderTemplate>
    </HeaderTemplate>
    <ItemTemplate>
    <div class="base-container-controls-98pct">
        <div class="base-container-controls-75pct">
            <asp:TextBox ID="UxItemNumber" runat="server" CssClass="textbox-readonly-xl"></asp:TextBox>
        </div>
        <div class="base-container-controls-10pct">
                <asp:TextBox ID="UxQuantity" runat="server" CssClass="textbox-md"></asp:TextBox>
        </div>  
    </div>
    </ItemTemplate>
    <FooterTemplate>
    </FooterTemplate>
</asp:Repeater>

一旦完成,我可以按照我的预期循环控制并获取它们的值,从中构建我的对象列表。结果如下:

// Find all textboxes, looping through them to build an object list.  Generally there is a maximum of 4 parts
// associated here but there could be more in the future so this should expand too.
for (int j = 0; j <= UxAdditionalParts.Items.Count - 1; j++)
    {
        if (UxAdditionalParts.Items[j].ItemType == ListItemType.Item || UxAdditionalParts.Items[j].ItemType == ListItemType.AlternatingItem)
            {
                TextBox txtItm = (TextBox)UxAdditionalParts.Items[j].FindControl("UxItemNumber");
                TextBox txtQty = (TextBox)UxAdditionalParts.Items[j].FindControl("UxQuantity");
                if (txtItm != null & txtQty != null)
                {
                    // Create a new part and add it to our list.
                    AdditionalPart objAdditionalPart = new AdditionalPart();
                    objAdditionalPart.ItemNumber = txtItm.Text;
                    objAdditionalPart.Quantity = Convert.ToInt32(txtQty.Text) ;
                    loAdditionalParts.Add(objAdditionalPart);
                }
            }
        } 

神秘解决了!