This question is locked. New answers and comments are not allowed.
Dear Support Team :-)
I'm having a blocking problem with the MVC grid.
What I want to archieve should be fairly easy to do, so it surprises me a little,
that I can't manage to get it working.
I want to add a delete button to the grid, but when I add the column:
Then the grid throws an exception: An item with the same key has already been added
Stacktrace:
Now I assume / suspect that it has to do with the multiple primary key that is configured for the datasource.
The primary key consists of a combination of 3 fileds: SubscriptionId, OptionId, Modes.
I've configured this in the following way:
I've read here on this forum that this was the way to do so.
The complete code of the grid is:
Could you help me out with this problem? I don't have a clue what I should do to avoid this error.
Thanks in advance.
Best regards,
Koen Appeltans
I'm having a blocking problem with the MVC grid.
What I want to archieve should be fairly easy to do, so it surprises me a little,
that I can't manage to get it working.
I want to add a delete button to the grid, but when I add the column:
columns.Command(commands =>{ commands.Delete().ButtonType(GridButtonType.Text);}).Width(90).Title("Commands");Then the grid throws an exception: An item with the same key has already been added
Stacktrace:
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)at Telerik.Web.Mvc.UI.GridDataKeyStore.GetRouteValues(Object dataItem)at Telerik.Web.Mvc.UI.GridUrlBuilder.DeleteUrl(Object dataItem)at Telerik.Web.Mvc.UI.Html.GridFormButtonBuilder.Create(Object dataItem)at Telerik.Web.Mvc.UI.Html.GridActionCellBuilder.AppendCellContent(IHtmlNode td, Object dataItem)at Telerik.Web.Mvc.UI.Html.GridDataCellBuilderBase.CreateCell(Object dataItem)at Telerik.Web.Mvc.UI.Html.GridDataRowBuilder.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()at Telerik.Web.Mvc.UI.Html.GridDataSectionBuilder.CreateBody(IEnumerable`1 rowBuilders)at Telerik.Web.Mvc.UI.Html.GridDataSectionBuilder.CreateBody(GridRenderingData renderingData)at Telerik.Web.Mvc.UI.Html.GridHtmlBuilder.CreateBody(GridRenderingData renderingData)at Telerik.Web.Mvc.UI.Html.GridHtmlBuilder.AppendData(IHtmlNode div, GridRenderingData renderingData)at Telerik.Web.Mvc.UI.Html.GridHtmlBuilder.CreateGrid(IDictionary`2 htmlAttributes, GridFunctionalData functionalData, GridRenderingData renderingData)at Telerik.Web.Mvc.UI.Grid`1.WriteHtml(HtmlTextWriter writer)at Telerik.Web.Mvc.UI.ViewComponentBase.ToHtmlString()at Telerik.Web.Mvc.UI.ViewComponentBuilderBase`2.ToHtmlString()at Telerik.Web.Mvc.{Dynamic}.GridBuilder`1\[\[Ogone.FrontEnd.Dto.NCFrontEnd.SubscriptionOption\, Ogone.FrontEnd.Dto\, Version=1.0.0.0\, Culture=neutral\, PublicKeyToken=null\]\].IHtmlString.ToHtmlString()at System.Web.HttpUtility.HtmlEncode(Object value)at System.Web.WebPages.WebPageExecutingBase.WriteTo(TextWriter writer, Object content)at System.Web.WebPages.WebPageBase.Write(Object value)at ASP._Page_Views_Subscription_SubscriptionOptions_cshtml.Execute() in c:\Workdir\dotNet\FrontEnd.root\FrontEnd\FrontEnd.Web.BackOffice\Views\Subscription\SubscriptionOptions.cshtml:line 14at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()at System.Web.WebPages.StartPage.RunPage()at System.Web.WebPages.StartPage.ExecutePageHierarchy()at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)Now I assume / suspect that it has to do with the multiple primary key that is configured for the datasource.
The primary key consists of a combination of 3 fileds: SubscriptionId, OptionId, Modes.
I've configured this in the following way:
.DataKeys(keys =>{ keys.Add(s => s.SubscriptionId); keys.Add(s => s.OptionId); keys.Add(s => s.Modes);})I've read here on this forum that this was the way to do so.
The complete code of the grid is:
@(Html.Telerik().Grid(Model.OptionsLinked) .Name("grid") .HtmlAttributes(new { @class = "gridTable", width = "100%" }) .DataKeys(keys => { keys.Add(s => s.SubscriptionId); keys.Add(s => s.OptionId); keys.Add(s => s.Modes); }) .DataBinding(d => d.Server() .Delete("SubscriptionOptionDelete", "Subscription", Html.OGAntiForgeryTokenRouteValues("Subscription/SubscriptionOptionDelete"))) .Columns(columns => { columns.Bound(s => s.OptionId) .ClientTemplate(Html.Ogone().ActionLink().Text("Delete").TargetAction("DeleteSubscription").RouteValues(new { Id = "<#= Id #>" }).ToString()) .Title("Delete") .Sortable(false) .Filterable(false); columns.Command(commands => { commands.Delete().ButtonType(GridButtonType.Text); }).Width(90).Title("Commands"); columns.Bound(s => s.SubscriptionId).Visible(false); columns.Bound(s => s.OptionId).Width(100); columns.Bound(s => s.Modes).Width(100); columns.Bound(s => s.MonthlyFee).Width(100); columns.Bound(s => s.SetupFee).Width(100); columns.Bound(s => s.Currency).Width(100); columns.Bound(s => s.ActivByMerchant).Width(100); columns.Bound(s => s.ByDefault).Width(100); columns.Bound(s => s.Selectable).Width(100); columns.Bound(s => s.TXCost).Width(100); columns.Bound(s => s.TXRate).Width(100); columns.Bound(s => s.MinCost).Width(100); columns.Bound(s => s.MaxCost).Width(100); columns.Bound(s => s.Cost3DS).Width(100); columns.Bound(s => s.Comments).Width(100); columns.Bound(s => s.ConfirmationMemoId).ClientTemplate("").Width(100); }) .EnableCustomBinding(true) .Filterable() .Sortable(sorting => { sorting.SortMode(GridSortMode.MultipleColumn); //sorting.OrderBy(sortOrder => sortOrder.Add(s => s.Id)); }))Could you help me out with this problem? I don't have a clue what I should do to avoid this error.
Thanks in advance.
Best regards,
Koen Appeltans