I'm trying to use a combo in a grid as follows:
@(Html.Infragistics() .Grid(Model) .ID("grid1") .PrimaryKey(nameof(LuItemType.ItemTypeId)) .UpdateUrl(Url.Action("UpdatingSaveChanges", "ItemType")) .AutoGenerateLayouts(false) .AutoCommit(true) .Columns(column => { column.For(x => x.ItemDesc).HeaderText("Description").DataType("string"); column.For(x => x.SafeWorkingLoad).HeaderText("SWL").DataType("string"); column.For(x => x.InspectionPeriodId).HeaderText("InspectionPeriod"); }) .Width("600px") .Height("500px") .Features(features => { features.Updating() .EditMode(GridEditMode.Row) .EnableDeleteRow(true) .EnableAddRow(true) .ColumnSettings(settings => { settings.ColumnSetting().ColumnKey(nameof(LuItemType.ItemDesc)) .EditorType(ColumnEditorType.Text).Required(true).Validation(true); settings.ColumnSetting().ColumnKey(nameof(LuItemType.SafeWorkingLoad)) .EditorType(ColumnEditorType.Text).Required(true).Validation(true); settings.ColumnSetting().ColumnKey(nameof(LuItemType.InspectionPeriodId)) .EditorType(ColumnEditorType.Combo) .ComboEditorOptions(options => { options.DataSourceUrl(Url.Action("GetComboData", "ItemType")) .TextKey(nameof(LuInspectionPeriod.InspectionPeriodDesc)) .ValueKey(nameof(LuInspectionPeriod.InspectionPeriodId)) .Mode(ComboMode.DropDown); }) .Required(true).Validation(true); });
}) .DataSourceUrl(Url.Action("GetGridData", "ItemType")) .DataBind() .Render())
However, the combo isn't loaded with any data, so I'm seeing the Id of the row rather than the text description, and when I try to drop the list there's no data in it.The data source method is as follows:
public class ItemType : LookUpController<LuItemType> {
... SNIP ...
[ComboDataSourceAction] public ActionResult GetComboData() {return View(RsContext.LuInspectionPeriod.AsQueryable()); }
}
And the entity class looks like:
public partial class LuInspectionPeriod { public LuInspectionPeriod() { LiftingItem = new HashSet<LiftingItem>(); LuItemType = new HashSet<LuItemType>(); }
[Required] public int InspectionPeriodId { get; set; } [Required] public string InspectionDesc { get; set; } [Required] public int? InspectionPeriodDays { get; set; } [Required] public int? InspectionPeriodMonths { get; set; }
public virtual ICollection<LiftingItem> LiftingItem { get; set; } public virtual ICollection<LuItemType> LuItemType { get; set; } }
When I click on a the cell with the combo I get this error in the console:
jquery.js:9566 GET https://localhost:44307/ItemType/GetComboData?textKey=InspectionPeriodId&valueKey=InspectionPeriodId&toLower=1&_=1492017867793 500 (Internal Server Error)
Is there anything obviously wrong with how I've set this up?
I am glad I was able to help. Please, don't hesitate to ask should you have other questions or issues!
Best regards,
Stamen Stoychev
That's sorted it, thanks Stamen. To anyone looking at the earlier code it's worth noting that the i's in this loop should be j's:
Hello,
Sorry for the late reply!
There were a couple of issues but the main one is that in order to build the lookup hash you need the combo's data source on the client when the grid tries to render. In the thread you found and used, the combo's data source is sent as part of the ViewData and that's the approach I used for the sample I am attaching. If you need the combo to bind remotely or otherwise prefer not sending the whole combo data source on page load, there is a different solution involving executing the lookup on the server and using complex objects for the grid's data source bound through a mapper and a custom combo provider. This could reduce the size of the response if the grid displays only a portion of the combo's data source at once. Otherwise sending the whole data with the view should be fine performance-wise anyway.
I hope the solution fits your application requirements. Please, let me know if you need further help on the issue!
Hi Stamen, any thoughts on what I'm still doing wrong here?
Sorry, there's a typo above, the client event is now set up as .AddClientEvent("rendered", "fillList") but still doesn't work.