I have a list of Plants and assosiated Projects. I want to output this in a table with all the Plants and use Telerik.Grid to expand a Plant, show a Telerik.Grid with associated Projects. I want the Projects to be dynamically loaded with Ajax.
The code for the grid:
#(Html.Telerik().Grid<PlantDto>()
.Name("Plants")
.Columns(columns =>
{
columns.Bound(plant => plant.Title);
})
.DetailView(details => details.ClientTemplate(
Html.Telerik().Grid<ProjectDto>()
.Name("Plant_<#= Id #>")
.DataBinding(dataBinding => dataBinding.Ajax()
.Select("ProjectsForPlant", "User", new { plantId = "<#= Id #>" }))
.ToHtmlString()
))
.DataBinding(dataBinding => dataBinding.Ajax().Select("PlantsForUser", "User"))
)
The initial data is loaded into the grid just fine (the list of Plants) but when I expand a plant I just get an empty sub-table.
Looking in FireBug there are no calls to the server. The controller that should serve the list of projects is never called.
Anyone have an idea on what it could be?
Update: Looks like what was causing trouble was that the plant.id had an "$" in it. Like "PCD$ODIN". Looks like that made life difficult for the JavaScript.
I compared your configuration to the one here and it looks identical. Test whether this Select method:
.Select("ProjectsForPlant", "User", new { plantId = "<#= Id #>" }))
set the plant id properly and if you need to name it exactly the same as the Id field instead of plantId, i.e.:
.Select("ProjectsForPlant", "User", new { Id = "<#= Id #>" }))
Related
I have a SQL Table result.
ProductNumber ProductNumberColorClass OrderNumber OrderNumberColorClass
I am trying to use Kendo to render this information. Basically i need the output as
ProductNumber OrderNumber
Data value and Apply Css class( ProductNumberColorClass )
Basically this is a report with a lot of columns. The user can select only the columns that he wants to see.
I am able to render the grid using the examples from the web site. I am not able to apply.
My application is Asp.net mvc application
Update
I will try your feedback. This is my code. Basically i wanted to avoid coding for each column as the list is big around 50 . the report can be customized so the user can hide some columns. .So i used a loop. however in this scenario, the clienttemplate is not work. I am not very sure, if it is a code issue too.
If you can find what is wrong in my code it will help me learn about the issue too.
meanwhileI am going to manually type the columns and add a attribute as visible
#(Html.Kendo().Grid <DataTransferObjects.ViewModels.UserReportDataModel>()
.Name("Grid")
.HtmlAttributes(new { style = "height: 550px;" })
.Pageable(pageable => pageable
.Input(true)
.Numeric(false)
)
.Sortable()
.Scrollable(
scr => scr.Height(430)
)
.Filterable()
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("GetReportData", "ShortTermPlanner").Data("AdditionnalParameters"))
.PageSize(20)
.ServerOperation(false)
)
.Columns(columns =>
{
var colIndex = 0;
foreach (var col in Model.lstHeaderInformation)
{
if (col.SqlColumnName == "ProductNumber")
{
columns.Bound(col.SqlColumnName)
.Title(col.ColumnHeader)
.Filterable(false)
.Visible(col.IsVisible)
.Width(1190)
.ClientTemplate("<div style='background-color:red; text-align:center;width:70px'> #= ProductNumber # </div>");
}
else
{
columns.Bound(col.SqlColumnName)
.Title(col.ColumnHeader)
.Filterable(true)
.Visible(true)
.Width(300)
.Locked(true)
.HtmlAttributes(new { #class = "selectedRow" });
}
}
})
.Resizable(resize => resize.Columns(true))
.Reorderable(reorder => reorder.Columns(true))
)
Update 2 Adding the clienttemplate and specifying the column information worked. Thanks
However i am curious, is there a better way where i can loop through a 3 table which defines the column name, title and class that needed to be displayed and applied to my report.
what i am looking is
MY Report -- Select * from Report
My header table Select colname, title, class from reportcoldefinication
so now for each matching colname from reportcoldefinication
and Report. add a col to the grid with the class applied.
You can use the template functionality for columns in the Kendo grid.
columns.Template(#<div class= '#=ProductNumberColorClass #'> #= ProductNumber#<div/>)
Have implemented one in the example in the below link. Its implemented using JQuery but you can use the razor syntax for kendo for achieving the same.
http://dojo.telerik.com/ukIma/3
So I have a Kendo Grid using the 'Hierarchical' mechanism. When I come to my Client Template portion, I'm doing this:
.Columns(column =>
{
column.Bound(o => o.Id).Width(110);
column.Bound(o => o.Title);
column.Bound(model => model.Id)
.ClientTemplate(String.Format("<i class=\"glyphicon glyph-btn directory\">Stuff</i>", Url.Action("Details", "Stuff", new { Id = "#=Id#" })))
.Width(40)
.Title("View");
})
When I run this up, the Id (on the first column) is coming out correctly - identifying the group item by its correct Id. However, when I try to use "#=Id#" in my hyperlink, this always refers to the Id of the original item that I clicked to show the group (client template).
Does anyone know how to use the Id of the group item (i.e. the output of that first column) in the hyperlink?
Thanks in advance
If you look at the answer to this telerik question:
You need to use \\#Id\\# within your ChildTemplate method to indicate you are accessing the current child element, not the parent. Change your syntax to the following:
.ClientTemplate(String.Format("<i class=\"glyphicon glyph-btn directory\">Stuff</i>", Url.Action("Details", "Stuff", new { Id = "\\#=Id\\#" })))
I have a Telerik MVC grid with a single detail view.
Inside the detail view is a telerik tabstrip. When I select the grid row to display, the detail will open up completely empty.
I have copied the tabstrip code outside the grid, changing the name of the grid to a static name and rendering the grid instead of outputting it as an htmlstring, and it displays perfectly.
I've tried registering all required javascript files, no change.
I'm pretty stumped at this point. I've cleared out the entire tabstrip so it contains nothing but text, but no change.
Here's the code which i have:
<%: Html.Telerik().Grid(Model.AccessRequests)
.Name("gridAccessRequests")
.ColumnContextMenu()
.DataKeys(d => { d.Add(a => a.Access_Request_ID).RouteKey("id");})
.DataBinding(dataBinding => dataBinding
.Ajax()
.Select("AjaxBinding", "Home")
.Insert("Insert", "Home")
.Update("Save", "Home")
.Delete("Delete", "Home"))
.ToolBar(commands => commands.Insert())
.Editable(editing => editing
.InsertRowPosition(GridInsertRowPosition.Bottom)
.Mode(GridEditMode.PopUp))
.HtmlAttributes(new { style = "width:100%" })
.Selectable()
.Sortable(sorting => sorting
.OrderBy(sortOrder => sortOrder.Add(o => o.EMPLOYEE_NAME).Ascending()))
.Filterable(filtering => filtering
.Filters(filters => filters
.Add(o => o.RECORD_YEAR).IsEqualTo(Model.CurrentYear)))
.Pageable(paging =>
paging.PageSize(15)
.Style(GridPagerStyles.NextPreviousAndNumeric)
.Position(GridPagerPosition.Both))
.ClientEvents(events =>
{
events.OnEdit("onEdit");
events.OnRowDataBound("requests_onRowDataBound");
})
.DetailView(details => details.ClientTemplate(
Html.Telerik()
.TabStrip()
.Name("TabStrip_<#=id#>")
.SelectedIndex(0)
.Items(items =>
{
items.Add().Text("Assets").Content("Assets");
items.Add().Text("Locations").Content("Locations");
})
.ToHtmlString()
))
.Columns(col =>
{
col.Bound(c => c.Access_Request_ID).Title("ID");
col.Bound(c => c.RECORD_YEAR).Title("Year");
col.Bound(c => c.VERSION_NO).Title("Version");
col.Bound(c => c.EMPLOYEE_NAME).Title("Name");
col.Command(commands =>
{
commands.Edit()
.ButtonType(GridButtonType.Image);
commands.Delete()
.ButtonType(GridButtonType.Image);
commands.Custom("Clone")// the constructor accepts the name of the custom command (used to differentiate between multiple custom commands)
.Text("Clone")
// Specify which fields from the bound data item to include in the route (pass as action method arguments)
.DataRouteValues(route => route.Add(o => o.Access_Request_ID).RouteKey("requestId"))
.Ajax(true)
// Which action method to call
.Action("CloneRequest", "Home");
}).Width(145)
.IncludeInContextMenu(false);
})%>
Here is the standalone tabstrip:
<%
Html.Telerik().TabStrip()
// Make the Name unique
.Name("TabStrip")
.SelectedIndex(0)
.Items(items =>
{
items.Add().Text("Assets").Content("Assets");
items.Add().Text("Locations").Content("Locations");
})
.Render();
%>
Any Suggestion/ Solution/Demo will be helpful.
Thanks in advance!
UPDATE
I have figured out that the tabstrips are not displaying on initial load of the grid; after hitting the grid's refresh button or paging the tabstrips display and function correctly.
It appears that there is an invalid property value error being thrown after the grid is loaded but before any databinding is completed, but I still can't seem to pinpoint the exact problem. Again, hitting the grid's refresh button or paging will successfully databind all the rows.
When the page first loads, the grid is loaded via server side binding. The tab strips are defined in the client template which is not used during server binding. When you refresh the grid, it is loaded via ajax binding and the client template is used.
You need to make the grid load initially via ajax binding so you need to use a different constructor.
Change this:
Html.Telerik().Grid(Model.AccessRequests)
to this:
Html.Telerik().Grid<AccessRequests>() //Put in the appropriate type for AccessRequests
I use Kendo grid inline editing mode and after editing I need to refresh datasource for my DropDownList.
The reason is my KendoGrid is supposed to add and edit data that my DropDownList uses.
I have no problem on editing data on KendoGrid and with the help of the code below I refresh the data on the DropDownList.
var dropDownList = $("#Domains").data("kendoDropDownList");
dropDownList.dataSource.read();
#Domains is the ID of my DropDownList
Everything work just fine even if I edit the data that is already selected on the DropDownList .
But the problem comes after adding new item in the KendoGrid (Inline Mode) and editing one of the older items which is selected on the DropDownList at the same time.
In this situation Kendo doesn't edit the item but It Adds edited item as a new item to the data source and we will have the old item and the edited one as two separate items.
I don't know if I convey the situation correctly.
I use MVC and the way I define datasource is like this:
.DataSource(dataSource => dataSource
.Ajax()
.Events(events => { events.Error("result_handler"); })
.Model(model => model.Id(p => p.Id))
.Create(create => create.Action("AddDomain", "Service", new { customerID = ViewBag.CustomerId }))
.Read(read => read.Action("GetDomainListForGrid", "Service", new { customerID = ViewBag.CustomerId }))
.Update(update => update.Action("EditDomain", "Service"))
.Destroy(destroy => destroy.Action("DeleteDomain", "Service"))
)
As you see I set model.Id like the above.
Not a great idea! but refreshing the data on grid before selecting the DropDownList item would help:
var grid = $("#grid").data("kendoGrid");
grid.dataSource.read();
HI
I am using telerik mvc grid with ajax binding
<%Html.Telerik().Grid<UserManagement.Models.setupEmployee>()
.Name("setupEmployees")
.DataBinding(dataBinding => dataBinding
//Ajax binding
.Ajax()
//The action method which will return JSON
.Select("_AjaxBindingEmployee", "UM")
).
Columns(colums =>
{
colums.Bound(o => o.EmployeeName).Title("Name");
colums.Bound(o => o.setupDesignation.Title).Title("Designation");
colums.Bound(o => o.Gender);
colums.Bound(o => o.DOB);
colums.Bound(o => o.EmployeeID).Format(
%><%Html.ActionLink("Edit", "Edit", new { Id = "{0}" }).ToString()).Encoded(false);
})
.Pageable()
.Sortable()
.Filterable()
.PrefixUrlParameters(false)
.Render();
%>
when i try to populate the grid with
return db.setupEmployees
i get the following error
A circular reference was detected while serializing an object of type. As i have relationship of this table with other tables.
To avoid this i may have two options either i use viewmodel or disable the relationships which is not possible. Any other sugession from your side
Regards
The associations created in the LinqToSql designer are under your control.
You can remove them (does not change the database).
You can edit them so they generate single sided properties instead of dual facing properties (does not change the database).
You can edit them so they generate no properties at all (does not change database).
The designer's file is a mapping file, it does not change the database.