我正在构建购物车设置的目录页面,在该页面上,我使用转发器显示每个产品及其数据。我希望使用下拉列表从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(实际上并没有使用它),因为这种绑定只是将每个数量添加到每个下拉列表中。
答案 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 = "" });
}