Подкачка Telerik radgrid в интернет-магазине прерывается при изменении количества товара на последней странице.C#

Место общения программистов C#
Ответить
Anonymous
 Подкачка Telerik radgrid в интернет-магазине прерывается при изменении количества товара на последней странице.

Сообщение Anonymous »

У меня возникли проблемы с одним из наших интернет-магазинов.
Радиационная сетка Telerik работает как корзина и перечисляет все продукты, находящиеся в настоящее время в корзине.
Пейджинг в Radgrid правильно разделяет представление корзины на разные страницы.
Проблема возникает, когда кто-то пытается вручную изменить количество продукта, но только если продукт находится на ПОСЛЕДНЕЙ странице radgrid и только если количество продуктов меньше предельного размера страницы.

Я пока не могу публиковать изображения, поэтому вынужден дать вам ссылку.
Ссылка на изображение https://i.sstatic.net/hfFIx.jpg

Я понял это настолько, насколько считает радгрид, что всегда существуют четные числа. количество продуктов в зависимости от размера страницы radgrid.

Сбой происходит в обработчике событий tbQuantity_TextChanged, более конкретно, когда var shopItemID = Convert.ToInt32(item.GetDataKeyValue(" ID")); вызывается для элемента, которого нет на этой странице, но он находится на другой странице.

Исключением является

Код: Выделить всё

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
Код Gridview
Код

Код: Выделить всё

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();
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
}
}
}
Заранее спасибо!

Изменить:
Небольшое обновление, Я пытался что-то придумать с CustomPaging, но безуспешно, поэтому я все еще использую опубликованный код как есть.
Мне кажется странным, что разбиение по страницам работает так, как должно сейчас, это происходит только тогда, когда я меняю сумма на последней странице, из-за которой происходит сбой.

Подробнее здесь: https://stackoverflow.com/questions/187 ... -on-last-p
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»