C# webshop中的Telerik radgrid分页,在更改最后一页上的产品数量时中断
我和我们的一个网店有点问题。 Telerik radgrid用作购物车,列出购物车中当前的所有产品。 Radgrid上的分页将cart视图正确地拆分为不同的页面。 当手动尝试更改产品数量时会出现问题,但仅当产品位于radgrid的最后一页且产品数量小于页面大小限制时才会出现问题 我还不能发布图片,所以必须给你一个链接。 图像链接 根据radgrid的页面大小,我已经计算出了radgrid相信的产品数量 崩溃发生在tbQuantity_TextChanged事件处理程序中,更具体地说是在C# webshop中的Telerik radgrid分页,在更改最后一页上的产品数量时中断,c#,asp.net,telerik,paging,radgrid,C#,Asp.net,Telerik,Paging,Radgrid,我和我们的一个网店有点问题。 Telerik radgrid用作购物车,列出购物车中当前的所有产品。 Radgrid上的分页将cart视图正确地拆分为不同的页面。 当手动尝试更改产品数量时会出现问题,但仅当产品位于radgrid的最后一页且产品数量小于页面大小限制时才会出现问题 我还不能发布图片,所以必须给你一个链接。 图像链接 根据radgrid的页面大小,我已经计算出了radgrid相信的产品数量 崩溃发生在tbQuantity_TextChanged事件处理程序中,更具体地说是在var s
var shopItemID=Convert.ToInt32(item.GetDataKeyValue(“ID”)时对于此页上不存在但另一页上存在的项目调用了code>
例外是
System.ArgumentOutOfRangeException was unhandled by user code
Message=Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
网格视图代码
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ShopItems.ascx.cs" Inherits="Litho.Framework.Web.Modules.Shop.ShopItems" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<telerik:RadGrid
ID="gvCartItems"
runat="server"
AutoGenerateColumns="False"
AllowPaging="True"
PageSize="5"
Skin="Default"
GridLines="None"
AllowFilteringByColumn="False"
AllowSorting="True"
ShowFooter="True"
OnNeedDataSource="gvCartItems_NeedDataSource"
OnItemCreated="gvCartItems_ItemCreated"
OnItemDataBound="gvCartItems_ItemDataBound"
OnDeleteCommand="gvCartItems_DeleteCommand">
<MasterTableView Width="100%" NoMasterRecordsText="Inga artiklar" ShowHeadersWhenNoRecords="false" DataKeyNames="ID">
<Columns>
<telerik:GridButtonColumn ButtonType="ImageButton" CommandName="Delete" Text="Radera" UniqueName="DeleteColumn" HeaderStyle-Width="20" />
<telerik:GridTemplateColumn HeaderText="Antal" HeaderStyle-Width="110px" DataField="Quantity" UniqueName="Quantity" Aggregate="Sum" FooterText="Totalt antal: ">
<ItemTemplate>
<telerik:RadNumericTextBox
ID="tbQuantity"
runat="server"
AutoPostBack="true"
Width="70px"
MinValue="1"
Visible="false"
ShowSpinButtons="true"
IncrementSettings-InterceptArrowKeys="false"
NumberFormat-GroupSizes="9"
NumberFormat-DecimalDigits="0"
IncrementSettings-InterceptMouseWheel="true"
NumberFormat-AllowRounding="False"
OnTextChanged="tbQuantity_TextChanged">
<EnabledStyle HorizontalAlign="Right" />
</telerik:RadNumericTextBox>
<telerik:RadComboBox ID="ddlQuantity" DataTextField="Quantity" DataValueField="Quantity" Visible="false" runat="server" Width="50px" AutoPostBack="true" OnSelectedIndexChanged="ddlQuantity_SelectedIndexChanged" />
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridBoundColumn HeaderText="Artnr" ReadOnly="True" DataField="ArticleNumber" UniqueName="ArticleNumber" HeaderStyle-Width="80" />
<telerik:GridTemplateColumn HeaderText="Artikel" UniqueName="Title" ShowFilterIcon="false">
<ItemTemplate>
<asp:HyperLink ID="hlTitle" runat="server" />
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="a`pris" UniqueName="Price" ShowFilterIcon="false">
<ItemTemplate>
<asp:Label ID="lblUnitprice" runat="server" />
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Totalpris" UniqueName="Totalprice" ShowFilterIcon="false">
<ItemTemplate>
<asp:Label ID="lblTotalPrice" runat="server" />
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
<FooterStyle Font-Bold="true" BackColor="#e6e6e6" />
<PagerStyle Mode="NextPrevAndNumeric" />
<FilterMenu EnableTheming="True">
<CollapseAnimation Duration="200" Type="OutQuint" />
</FilterMenu>
</telerik:RadGrid>
<asp:PlaceHolder ID="phItemSummary" runat="server" />
代码隐藏
using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using Litho.Framework.BusinessLayer;
using Litho.Framework.BusinessLayer.Base;
using Litho.Framework.BusinessLayer.Base.Settings;
using Litho.Framework.BusinessLayer.Modules.Shop;
using Litho.Framework.PresentationLayer;
using Litho.Framework.ServiceLayer;
using Telerik.Web.UI;
namespace Litho.Framework.Web.Modules.Shop
{
public partial class ShopItems : UserControl
{
IShopItemHolder _shopItemHolder = null;
bool _readMode = true;
SessionHelper _sessionHelper = new SessionHelper();
#region Public methods
public void LoadItems(IShopItemHolder shopItemHolder, bool readMode)
{
_shopItemHolder = shopItemHolder;
_readMode = readMode;
gvCartItems.Rebind();
loadItemsSummary();
}
private void loadItemsSummary()
{
phItemSummary.Controls.Clear();
var ucItemSummary = (ShopItemsSummary)Page.LoadControl("~/Modules/Shop/ShopItemsSummary.ascx");
ucItemSummary.LoadItemSummary(_shopItemHolder);
phItemSummary.Controls.Add(ucItemSummary);
}
#endregion
#region Events
protected void gvCartItems_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
gvCartItems.DataSource = _shopItemHolder.Items;
}
protected void gvCartItems_ItemCreated(object sender, GridItemEventArgs e)
{
if (e.Item is GridDataItem)
{
var item = (GridDataItem)e.Item;
var btnDelete = (ImageButton)item["DeleteColumn"].Controls[0];
btnDelete.ImageUrl = string.Format("~/Base/Themes/{0}/Images/Icons16x16/iconDelete.png", SettingsManager.GetGlobalSettings().AdminTheme);
btnDelete.Visible = !_readMode;
}
}
protected void gvCartItems_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item is GridDataItem)
{
var shopItem = (IShopItem)e.Item.DataItem;
var hlTitle = (HyperLink)e.Item.FindControl("hlTitle");
var lblUnitPrice = (Label)e.Item.FindControl("lblUnitprice");
var lblTotalPrice = (Label)e.Item.FindControl("lblTotalPrice");
if (!shopItem.IsExternal)
{
var tbQuantity = (RadNumericTextBox)e.Item.FindControl("tbQuantity");
tbQuantity.ShowSpinButtons = !_readMode;
tbQuantity.Text = shopItem.Quantity.ToString();
tbQuantity.Visible = true;
tbQuantity.Enabled = !_readMode;
}
else
{
if (!_readMode)
{
var ddlQuantity = (RadComboBox)e.Item.FindControl("ddlQuantity");
ddlQuantity.DataSource = shopItem.PriceCollection;
ddlQuantity.DataBind();
ddlQuantity.SelectedValue = shopItem.Quantity.ToString();
ddlQuantity.Visible = true;
}
}
if (!shopItem.IsExternal)
{
var parameters = new Dictionary<string, string>();
parameters.Add(KeyMaster.RequestParamsNames.Modules.Shop.PRODUCT_ID, shopItem.ID.ToString());
hlTitle.NavigateUrl = new FWContent().GetContentUrl(ModuleIDConstant.SHOP, ContentIDConstant.Shop.PRODUCT_VIEW, parameters);
}
hlTitle.Text = shopItem.Title;
lblUnitPrice.Text = shopItem.Price.ToString("0.00") + " SEK";
lblTotalPrice.Text = shopItem.GetCost(false).ToString("0.00") + " SEK";
}
}
protected void tbQuantity_TextChanged(object sender, EventArgs e)
{
if (!_readMode)
{
RadNumericTextBox tbQuantity;
foreach (GridDataItem item in gvCartItems.Items)
{
if (item is GridDataItem)
{
tbQuantity = item.FindControl("tbQuantity") as RadNumericTextBox;
var shopItemID = Convert.ToInt32(item.GetDataKeyValue("ID"));
var shopItem = _sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID);
if (!shopItem.IsExternal)
{
_sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID).Quantity = Convert.ToInt32(tbQuantity.Text);
_sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID).TotalPrice = _sessionHelper.CurrentCart.GetItemCost(shopItemID, false);
_shopItemHolder = _sessionHelper.CurrentCart;
}
}
}
loadItemsSummary();
gvCartItems.Rebind();
}
}
protected void gvCartItems_DeleteCommand(object source, GridCommandEventArgs e)
{
if (!_readMode)
{
var cartItemID = (int)e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["ID"];
_sessionHelper.CurrentCart.DeleteItem(cartItemID);
_shopItemHolder = _sessionHelper.CurrentCart;
if (_sessionHelper.CurrentCart.Items.Count == 0)
{
Response.Redirect(new FWContent().GetContentUrl(ModuleIDConstant.SHOP, ContentIDConstant.Shop.CART));
}
else
{
gvCartItems.Rebind();
loadItemsSummary();
}
}
}
protected void ddlQuantity_SelectedIndexChanged(object sender, EventArgs e)
{
RadComboBox ddlQuantity;
foreach (GridDataItem item in gvCartItems.Items)
{
if (item is GridDataItem)
{
ddlQuantity = item.FindControl("ddlQuantity") as RadComboBox;
var cartItemID = Convert.ToInt32(item.GetDataKeyValue("ID"));
var cartItem = _sessionHelper.CurrentCart.CartItems.Find(x => x.ID == cartItemID);
if (cartItem.IsExternal)
{
cartItem.Quantity = Convert.ToInt32(ddlQuantity.Text);
cartItem.TotalPrice = getProductPrice(cartItem);
}
}
}
loadItemsSummary();
gvCartItems.Rebind();
}
#endregion
private double getProductPrice(CartItem cartitem)
{
foreach (var price in cartitem.PriceCollection)
{
if (price.Quantity == cartitem.Quantity)
{
return price.Price;
}
}
throw new Exception(); // todo lägg till customexception
}
}
}
protected void tbQuantity_TextChanged(object sender, EventArgs e)
{
if (!_readMode)
{
RadNumericTextBox tbQuantity = (RadNumericTextBox)sender;
GridDataItem dataItem = (GridDataItem)tbQuantity.NamingContainer;
var shopItemID = (int)dataItem.GetDataKeyValue("ID");
var shopItem = _sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID);
if (!shopItem.IsExternal)
{
_sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID).Quantity = Convert.ToInt32(tbQuantity.Text);
_sessionHelper.CurrentCart.CartItems.Find(x => x.ID == shopItemID).TotalPrice = _sessionHelper.CurrentCart.GetItemCost(shopItemID, false);
_shopItemHolder = _sessionHelper.CurrentCart;
}
loadItemsSummary();
gvCartItems.Rebind();
}
}
使用系统;
使用System.Collections.Generic;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用Litho.Framework.BusinessLayer;
使用Litho.Framework.BusinessLayer.Base;
使用Litho.Framework.BusinessLayer.Base.Settings;
使用Litho.Framework.BusinessLayer.Modules.Shop;
使用Litho.Framework.PresentationLayer;
使用Litho.Framework.ServiceLayer;
使用Telerik.Web.UI;
命名空间Litho.Framework.Web.Modules.Shop
{
公共部分类ShopItems:UserControl
{
IShopItemHolder _shopItemHolder=null;
bool _readMode=true;
SessionHelper _SessionHelper=新SessionHelper();
#区域公共方法
公共无效加载项(IShopItemHolder shopItemHolder,bool readMode)
{
_店主=店主;
_readMode=readMode;
gvCartItems.Rebind();
loadItemsSummary();
}
私有void loadItemsSummary()
{
phItemSummary.Controls.Clear();
var ucItemSummary=(ShopItemsSummary)Page.LoadControl(“~/Modules/Shop/ShopItemsSummary.ascx”);
ucItemSummary.LoadItemSummary(_shopItemHolder);
phItemSummary.Controls.Add(ucItemSummary);
}
#端区
#地区活动
受保护的void gvCartItems_NeedDataSource(对象源,GridNeedDataSourceEventArgs e)
{
gvCartItems.DataSource=\u shopItemHolder.Items;
}
受保护的无效gvCartItems\u ItemCreated(对象发送方,GridItemEventArgs e)
{
if(e.Item为GridDataItem)
{
var item=(GridDataItem)e.item;
var btnDelete=(ImageButton)项[“DeleteColumn”]。控件[0];
btnDelete.ImageUrl=string.Format(“~/Base/Themes/{0}/Images/Icons16x16/iconDelete.png”,setingsManager.GetGlobalSettings().AdminTheme);
btnDelete.Visible=!\u读取模式;
}
}
受保护的void gvCartItems\u ItemDataBound(对象发送方,GridItemEventArgs e)
{
if(e.Item为GridDataItem)
{
var shopItem=(IShopItem)e.Item.DataItem;
var hlTitle=(超链接)e.Item.FindControl(“hlTitle”);
var lblUnitPrice=(标签)e.Item.FindControl(“lblUnitPrice”);
var lblTotalPrice=(标签)e.Item.FindControl(“lblTotalPrice”);
如果(!shopItem.IsExternal)
{
变量tbQuantity=(RadNumericTextBox)e.Item.FindControl(“tbQuantity”);
tbQuantity.ShowSpinButtons=!\u读取模式;
tbQuantity.Text=shopItem.Quantity.ToString();
tbQuantity.Visible=true;
tbQuantity.Enabled=!\u读取模式;
}
其他的
{
如果(!\u读取模式)
{
变量ddlQuantity=(RadComboBox)e.Item.FindControl(“ddlQuantity”);
ddlQuantity.DataSource=shopItem.PriceCollection;
ddlQuantity.DataBind();
ddlQuantity.SelectedValue=shopItem.Quantity.ToString();
ddlQuantity.Visible=true;
}
}
如果(!shopItem.IsExternal)
{
var参数=新字典();
parameters.Add(KeyMaster.RequestParamsNames.Modules.Shop.PRODUCT_ID,shopItem.ID.ToString());
hlTitle.NavigateUrl=new FWContent().GetContentUrl(ModuleIDConstant.SHOP,ContentIDConstant.SHOP.PRODUCT_视图,参数);
}
hlTitle.Text=shopItem.Title;
lblUnitPrice.Text=shopItem.Price.ToString(“0.00”)+“瑞典克朗”;
lblTotalPrice.Text=shopItem.GetCost(false).ToString(“0.00”)+“SEK”;
}
}
受保护的无效TBU文本已更改(对象发送方,事件参数e)
{
如果(!\u读取模式)
{
RadNumericTextBox tbQuantity;
foreach(gvCartItems.Items中的GridDataItem项)
{
if(项为GridDataItem)
{
tbQuantity=item.FindControl(“tbQuantity”)作为RadNumericTextBox;
var shopItemID=Convert.ToInt32(item.GetDataKeyValue(“ID”);
var shopItem=\u sessionHelper