Hi,
I am trying to use a hierarchical grid using MVC 5. I am suppose to have three levels of data in the grid - parent , child and grand child.
I am able to bind the parent but not the child using Load on demand from the controller.
--Modelpublic class ParentViewModel{ public int PId {get; set;} public string Name {get; set;} public ICollection ChildDetails}
Public class ChildViewModel{ public int CId {get; set;} public int PId {get; set;} public int CData {get; set;}}
--View@model Infragistics.Web.Mvc.GridModel
(Html.Infragistics().Grid(Model))
--Controller
private GridModel GetGridModel(){
GridModel model = new GridModel(); model.AutoGenerateColumns = false; model.AutoCommit = true; model.PrimaryKey = "PId"; model.AutoGenerateLayouts = false; model.ID = "igGrid";
model.LoadOnDemand = true;
model.Columns.Add(new GridColumn { Key = "PId", Hidden = true, DataType = "number" }); model.Columns.Add(new GridColumn { Key = "Name", HeaderText = "Parent Name ", DataType = "string" }); model.DataSourceUrl = (Url.Action("BindParentDetails"));
GridColumnLayoutModel childModel = new GridColumnLayoutModel(); childModel.Key = "ChildDetails"; childModel.PrimaryKey = "PID"; childModel.ForeignKey = "CId"; childModel.AutoGenerateColumns = false; childModel.Columns.Add(new GridColumn { Key = "CId", HeaderText = "Child ID", DataType = "number" }); childModel.Columns.Add(new GridColumn { Key = "CData", HeaderText = "Child Data", DataType = "number" }); childModel.DataSourceUrl = Url.Action("BindChildDetails");
model.ColumnLayouts.Add(childModel); return model;}
public JsonResult BindParentDetails() { GridModel rModel = GetGridModel();
var p = _service.GetPDetails();
rModel.DataSource = p.AsQueryable(); var res = rModel.GetData(); return res; }
public JsonResult BindChildDetails(string path, string layout) { var pid = path.Substring(path.LastIndexOf(':') + 1);
GridModel grd = GetGridModel();
var p = _service.GetChildDetails(pId); grd.DataSource = p.AsQueryable(); var res = grd.GetData(path, layout); return res; }
When I run the solution it binds the parent grid correctly. On clicking the + icon it goes into BindChildDetails function and breaks on:
var res = grd.GetData(path, layout);
An exception of type 'System.NullReferenceException' occurred in Infragistics.Web.Mvc.dll but was not handled in user code
Additional information: Object reference not set to an instance of an object.
It has correct values in path and layout
grd.DataSource is set correctly with the data from the DB.
The version of Infragistics.Web.Mvc we are using is 5.16.2.2040
Can anyone please help me with this?
Hello Singh,
Thank you for contacting Infragistics!
Looking at your code it appears you return the child and parent model/layout in GetGridModel, when you should have different methods for each level. Here is documentation and a sample on setting up Load on Demand in the igHierarchicalGrid:
https://www.igniteui.com/help/ighierarchicalgrid-load-on-demand
https://www.igniteui.com/hierarchical-grid/load-on-demand
Thanks Mike
I have tried as you suggested but still getting the same error
--Modelpublic class ParentViewModel{ public int PId {get; set;} public string Name {get; set;} public ICollection<ChildViewModel> ChildDetails}
-- View@model Infragistics.Web.Mvc.GridModel
GridColumnLayoutModel childModel = GetChildGridModel();
private GridModel GetChildGridModel(){ GridColumnLayoutModel childModel = new GridColumnLayoutModel(); childModel.Key = "ChildDetails"; childModel.PrimaryKey = "CID"; childModel.ForeignKey = "PId"; childModel.AutoGenerateColumns = false; childModel.Columns.Add(new GridColumn { Key = "CId", HeaderText = "Child ID", DataType = "number" }); childModel.Columns.Add(new GridColumn { Key = "CData", HeaderText = "Child Data", DataType = "number" }); childModel.DataSourceUrl = Url.Action("BindChildDetails"); return childModel ;
} public JsonResult BindParentDetails() { GridModel rModel = GetGridModel();