在转发器中唯一地填充下拉列表

时间:2018-03-14 13:43:43

标签: c# asp.net webforms

我正在构建购物车设置的目录页面,在该页面上,我使用转发器显示每个产品及其数据。我希望使用下拉列表从0开始显示,直到产品的数量,这将使每个DDL对于与页面关联的产品而言是唯一的。

我似乎无法找到以某种方式绑定DDL的方法,只看到如何在转发器的ItemDataBound方法中绑定所有这些。

编辑:

我的网页表单

<asp:Repeater ID="rptProducts" runat="server" OnItemDataBound="rptProducts_ItemDataBound">
    <ItemTemplate>
        <div class="col-md-8 col-md-offset-2 product">
            <img src="<%# Eval("ImageFile") %>" class="col-xs-12" alt="<%# Eval("Name") %> Product Image" />
            <h3><%# Eval("Name") %></h3>
            <p><%# Eval("ShortDescription") %></p>
            <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
        </div>
    </ItemTemplate>
</asp:Repeater>

我的ItemDataBound(从另一个帖子here找到)

protected void rptProducts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DropDownList ddl = (DropDownList)e.Item.FindControl("DropDownList1");

    foreach(var prod in ProductsList)
    {
        ddl.Items.Add(new ListItem(prod.QuantOnHand.ToString(), prod.QuantOnHand.ToString()));
    }
}

我显然没有正确使用ItemDataBound(实际上并没有使用它),因为这种绑定只是将每个数量添加到每个下拉列表中。

2 个答案:

答案 0 :(得分:1)

对于我来说,这听起来像是一个自定义控件的工作,你有一个名为int的{​​{1}}属性,并在Quantity方法中使用它来写出html选项元件。

这是一个简化版本。您的最终代码需要处理(至少)Render()name值:

ID

然后,您可以将此控件的实例包含在Repeater标记中。

[ToolboxData("<{0}:QuantityDropDown runat=\"server\"></{0}:QuantityDropDown >")]
public class QuantityDropDown : Control
{
   public int Quantity {
       get { return (int)(ViewState["Quantity"] ?? default(int)); }
       set {ViewState["Quantity"] = value;}
   }

   protected override void Render (HtmlTextWriter writer)
   {
       writer.RenderBeginTag(HtmlTextWriterTag.Select);
       for (int i=0; i < Quantity; i++)
       { 
           writer.AddAttribute("value", i);
           writer.RenderBeginTag(HtmlTextWriterTag.Option);
           writer.Write(i.ToString());
           writer.RenderEndTag();
       } 
       writer.RenderEndTag();
       writer.WriteLine();
   }
}

答案 1 :(得分:1)

这是在ItemDataBound方法中填充DropDownList的最简单方法。在此代码段中,productQuantity来自Repeater源数据。但您也可以执行数据库调用以获取正确的数量。然后你需要一个你可以这样得到的ID:productQuantity = Convert.ToInt32(item["ID"]);

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DropDownList ddl = (DropDownList)e.Item.FindControl("DropDownList1");

    //the product quantity variable
    int productQuantity = 0;

    //cast the repeater item back to a datarowview
    DataRowView item = e.Item.DataItem as DataRowView;

    //or if a List<objects> is bound, cast it back to it's class
    //MyClass item = e.Item.DataItem as MyClass

    //get the quantity from the repeater source item to fill the ddl
    productQuantity = Convert.ToInt32(item["quantity"]);

    //add the items to the ddl
    for (int i = 0; i < productQuantity; i++)
    {
        ddl.Items.Add(new ListItem() { Text = i.ToString(), Value = i.ToString() });
    }

    //add a listitem to the ddl at position 0
    ddl.Items.Insert(0, new ListItem() { Text = "Select Quantity", Value = "" });
}