Crew .NET |
|
Ik heb even een testprojectje aangemaakt om je situatie een beetje te simuleren. Volgende code zorgt ervoor dat er in de repeater voor elk item in de winkelwagen een DropDownList komt met een keuze voor de aantallen (in dit voorbeeld 1-4). De waarde van de DropDownList staat op de waarde die meegegeven is (SelectedValue).
<asp:Repeater runat="server" ID="ItemsRepeater" OnItemCreated="ItemCreated" >
<HeaderTemplate>
Naam Prijs Aantal<br />
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Name")%> -
<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Price")%> -
<asp:DropDownList ID="CountDropDown" runat="server" AutoPostBack="true" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "Count")%>'>
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
</asp:DropDownList>
<br />
</ItemTemplate>
</asp:Repeater>
<asp:Repeater runat="server" ID="ItemsRepeater" OnItemCreated="ItemCreated" > <HeaderTemplate> Naam Prijs Aantal<br /> </HeaderTemplate> <ItemTemplate> <%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Name")%> - <%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Price")%> - <asp:DropDownList ID="CountDropDown" runat="server" AutoPostBack="true" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "Count")%>'> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> <br /> </ItemTemplate> </asp:Repeater>
Hieronder staat de C# code van mijn voorbeeld om de Repeater te vullen:
public partial class Default : Page
{
//Dit is maar een testklasse met dummy-data om in de Repeater te stoppen
private readonly List<CartItem> _list = new List<CartItem>
{
new CartItem { Item = ContentFactory.ItemOne1, Count = 2},
new CartItem { Item = ContentFactory.ItemOne2, Count = 1},
new CartItem { Item = ContentFactory.ItemTwo1, Count = 3},
new CartItem { Item = ContentFactory.ItemTwo2, Count = 2}
};
protected void Page_Load(object sender, EventArgs e)
{
ItemsRepeater.DataSource = _list;
ItemsRepeater.DataBind();
}
}
public partial class Default : Page { //Dit is maar een testklasse met dummy-data om in de Repeater te stoppen private readonly List <CartItem > _list = new List <CartItem > { new CartItem { Item = ContentFactory. ItemOne1, Count = 2}, new CartItem { Item = ContentFactory. ItemOne2, Count = 1}, new CartItem { Item = ContentFactory. ItemTwo1, Count = 3}, new CartItem { Item = ContentFactory. ItemTwo2, Count = 2} }; protected void Page_Load(object sender, EventArgs e) { ItemsRepeater.DataSource = _list; ItemsRepeater.DataBind(); } }
Hiermee zijn dus je eerste twee probleempjes opgelost:
- er staat een DropDownList om het aantal te wijzigen
- de geselecteerde waarde is de waarde van het aantal voor het item
Enkel naar puntje drie moet ik nog eens kijken. Hopelijk kan je hier al verder mee!
Edit:
Ik heb het derde probleempje ook opgelost. De code ziet er een beetje anders uit nu, dus hieronder is de volledige code (ASP.NET en C#) om alles te laten werken:
.aspx
<asp:Repeater runat="server" ID="ItemsRepeater">
<HeaderTemplate>
Naam Prijs Aantal<br />
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="NameLabel" runat="server" Text='<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Name")%>' /> -
<asp:Label ID="PriceLabel" runat="server" Text='<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Price")%>' /> -
<asp:DropDownList ID="CountDropDown" runat="server" AutoPostBack="true" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "Count")%>' OnSelectedIndexChanged="DdListSelectedIndexChanged">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
</asp:DropDownList>
<br />
</ItemTemplate>
</asp:Repeater>
<asp:Repeater runat="server" ID="ItemsRepeater"> <HeaderTemplate> Naam Prijs Aantal<br /> </HeaderTemplate> <ItemTemplate> <asp:Label ID="NameLabel" runat="server" Text='<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Name")%>' /> - <asp:Label ID="PriceLabel" runat="server" Text='<%# DataBinder.Eval(((CartItem)Container.DataItem).Item, "Price")%>' /> - <asp:DropDownList ID="CountDropDown" runat="server" AutoPostBack="true" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "Count")%>' OnSelectedIndexChanged="DdListSelectedIndexChanged"> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> <br /> </ItemTemplate> </asp:Repeater>
.cs
using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using DropDownRepeater.Code;
namespace DropDownRepeater
{
public partial class Default : Page
{
private readonly List<CartItem> _list = new List<CartItem>
{
new CartItem { Item = ContentFactory.ItemOne1, Count = 2},
new CartItem { Item = ContentFactory.ItemOne2, Count = 1},
new CartItem { Item = ContentFactory.ItemTwo1, Count = 3},
new CartItem { Item = ContentFactory.ItemTwo2, Count = 2}
};
protected void Page_Init(object sender, EventArgs e)
{
ItemsRepeater.DataSource = _list;
ItemsRepeater.ItemDataBound += RepeaterItemDataBound;
ItemsRepeater.DataBind();
}
protected void RepeaterItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
var countList = e.Item.FindControl("CountDropDown") as DropDownList;
if ((countList != null))
countList.SelectedIndexChanged += DdListSelectedIndexChanged;
}
}
protected void DdListSelectedIndexChanged(object sender, EventArgs e)
{
var ddList = sender as DropDownList;
var rItem = ddList.Parent as RepeaterItem;
var itemLabel = rItem.FindControl("NameLabel") as Label;
var itemName = itemLabel.Text;
var shopListItem = _list.Find(i => i.Item.Name.Equals(itemName));
shopListItem.Count = Convert.ToInt32(ddList.SelectedValue);
}
}
}
using System; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.WebControls; using DropDownRepeater.Code; namespace DropDownRepeater { public partial class Default : Page { private readonly List <CartItem > _list = new List <CartItem > { new CartItem { Item = ContentFactory. ItemOne1, Count = 2}, new CartItem { Item = ContentFactory. ItemOne2, Count = 1}, new CartItem { Item = ContentFactory. ItemTwo1, Count = 3}, new CartItem { Item = ContentFactory. ItemTwo2, Count = 2} }; protected void Page_Init(object sender, EventArgs e) { ItemsRepeater.DataSource = _list; ItemsRepeater.ItemDataBound += RepeaterItemDataBound; ItemsRepeater.DataBind(); } protected void RepeaterItemDataBound(object sender, RepeaterItemEventArgs e) { if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { var countList = e.Item.FindControl("CountDropDown") as DropDownList; if ((countList != null)) countList.SelectedIndexChanged += DdListSelectedIndexChanged; } } protected void DdListSelectedIndexChanged(object sender, EventArgs e) { var ddList = sender as DropDownList; var rItem = ddList.Parent as RepeaterItem; var itemLabel = rItem.FindControl("NameLabel") as Label; var itemName = itemLabel.Text; var shopListItem = _list.Find(i => i.Item.Name.Equals(itemName)); shopListItem.Count = Convert.ToInt32(ddList.SelectedValue); } } }
Enkel moet je in het SelectedIndexChanged event de gewijzigde waarde dan ook doorsturen naar je cookie / database / ...
Zo, ik hoop dat dit de oplossing is die je zoekt! |