@(
Html.Kendo().Grid<
User
>()
.Name("grid")
.Pageable(config => config
.Info(true)
)
.Sortable()
.Filterable()
.ColumnMenu(config =>
config.Enabled(true))
.Columns(config =>
{
config.Bound(user => user.Id);
config.Bound(user => user.FirstName);
config.Bound(user => user.LastName);
config.Bound(user => user.UserName);
config.Bound(user => user.Type)
.ClientTemplate("#=Type#")
.Filterable(filter => filter
.UI("typeFilter")
.Extra(false)
);
}
)
.DataSource(dataSourceBuilder => dataSourceBuilder
.WebApi()
.Read(config => config
.Url("/api/data/users")
)
)
)
----
<
script
type
=
"text/javascript"
>
function typeFilter(element) {
element.kendoMultiSelect(
{
dataTextField: "name",
dataValueField: "id",
dataSource: {
data: [
{ id: 1, name: "Builder"},
{ id: 2, name: "Police Man"}
]
}
});
}
</
script
>
Hi Kendo,
Building user-controls - or controls that may be added on many pages throughout a website - how is this done with Kendo?
I can think of - at least - 3 different types of usercontrols:
Is it possible to build those 3 types of controls so they may be re-used in more than one page ?
Thank you.
<
script
type
=
"text/kendo"
id
=
"customerTemplate"
>
#if(data != null){#
#:data.Name#
#}#
</
script
>
<
script
type
=
"text/javascript"
>
var customerTemplate = kendo.template($("#customerTemplate").html(), { useWithBlock: false });
</
script
>
<
div
class
=
"container"
>
<
div
class
=
"row"
>
<
div
class
=
"col-md-12 sl-table"
>
@(Html.Kendo().Grid<
ProjectModel
>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.Name);
columns.Bound(p => p.CustomerContract).ClientTemplate("#=customerTemplate(CustomerContract)#");
columns.Command(command =>
{
command.Edit();
command.Destroy();
}).Width(180);
})
.ToolBar(toolbar => toolbar.Create())
.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("ProjectPopUpTemplate"))
.Pageable()
.Sortable()
.Scrollable()
.HtmlAttributes(new {style = "height:500px;"})
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(10)
.Events(events => events.Error("error_handler"))
.Model(model => model.Id(p => p.Id))
.Create(update => update.Action("EditingPopup_Create", "ProjectManagement"))
.Read(read => read.Action("EditingPopup_Read", "ProjectManagement"))
.Update(update => update.Action("EditingPopup_Update", "ProjectManagement"))
.Destroy(destroy => destroy.Action("EditingPopup_Destroy", "ProjectManagement"))
)
)
</
div
>
</
div
>
</
div
>
public
class
ProjectManagementController : BaseController
{
static
readonly
ILog Log = LogManager.GetLogger(
"ProjectManagementController.class"
);
private
static
readonly
List<Customer> CustomerList =
new
List<Customer>();
public
ProjectServiceClient ProjectService {
get
;
set
; }
public
CustomerServiceClient CustomerService {
get
;
set
; }
public
ProjectModel Model {
get
;
set
; }
public
ProjectManagementController()
{
try
{
ProjectService =
new
ProjectServiceClient();
CustomerService =
new
CustomerServiceClient();
}
catch
(Exception e)
{
Log.Error(e);
throw
;
}
}
// GET: ProjectManagement
public
ActionResult Projects()
{
List<CustomerContract> customers = CustomerService.GetCustomers().ToList();
Model =
new
ProjectModel();
foreach
(var customer
in
customers)
{
CustomerList.Add(
new
Customer
{
Name = customer.Name,
Id = customer.Id
});
}
ViewData[
"Customers"
] = GetAll();
return
View(Model);
}
public
ActionResult EditingPopup_Read([DataSourceRequest] DataSourceRequest request)
{
ProjectContract[] list = ProjectService.GetProjects();
return
Json(list.ToDataSourceResult(request));
}
[AcceptVerbs(HttpVerbs.Post)]
public
ActionResult EditingPopup_Create([DataSourceRequest] DataSourceRequest request, ProjectModel project)
{
if
(project !=
null
&& ModelState.IsValid)
{
CustomerContract customer = CustomerService.GetCustomer(project.CustomerContract.Id);
var newProject = ProjectService.InsertProject(
new
ProjectContract
{
CustomerContract = customer,
Name = project.Name,
Id = project.Id
});
ProjectService.UpdateProject(newProject);
}
return
Json(
new
[] { project }.ToDataSourceResult(request, ModelState));
}
}
public
class
ProjectModel
{
private
ProjectContract _projectContract;
public
ProjectModel(ProjectContract projectContract)
{
ProjectContract = projectContract;
}
public
ProjectModel()
{
}
public
CustomerServiceClient CustomerService {
get
;
set
; }
private
ProjectContract ProjectContract
{
get
{
if
(_projectContract ==
null
)
{
_projectContract =
new
ProjectContract();
}
return
_projectContract;
}
set
{ _projectContract = value; }
}
[Display(Name =
"Customer"
)]
public
CustomerContract CustomerContract
{
get
{
if
(ProjectContract.CustomerContract ==
null
)
{
return
new
CustomerContract();
}
return
ProjectContract.CustomerContract;
}
set
{ ProjectContract.CustomerContract = value; }
}
[Display(Name =
"Customers"
)]
public
List<Customer> Customers {
get
;
set
; }
[ScaffoldColumn(
false
)]
public
int
Id
{
get
{
return
ProjectContract.Id; }
set
{ ProjectContract.Id = value; }
}
[Display(Name =
"Project Name"
)]
public
string
Name
{
get
{
return
ProjectContract.Name; }
set
{ ProjectContract.Name = value; }
}
}
Hello there,
I have a grid set up and I'd like to change the row and or cell style based on the value of a particular column. For example a field had a value of "live" the row would be green or alternatively thee would be a green icon next word "live". Can the grid do this? I had a look at templates but they don't seem to be specific enough or perhaps I wasn't understanding them. I don't need any CSS/styling advice I just need to know if the grid can assign a class or whatever to the cell or row based on a single field data and if so how?
When use Grid edit command without calling GridActionColumnFactory.Edit(). GridBuilder would not render localization script for the popup edit. Just like the code.​
@(Html.Kendo().Grid<
ProduceViewModel
>()
.Name("grid")
.DataSource(datasource=>
/*...*/
)
.Columns(columns =>
{
columns.Bound(m => m.ProductId).ClientTemplate("<
a
onclick
=
'edit(this)'
>#=ProductId#</
a
>");
columns.Bound(m => m.ProductName);
columns.Command(command =>
{
command.Destroy();
});
})
)
Entity Model for Country (All models are in a separate project)
[ScaffoldColumn(
false
)]
public
int
CountryId {
get
;
set
; }
public
string
ShortName {
get
;
set
; }
public
string
LongName {
get
;
set
; }
public
string
IsoCode2 {
get
;
set
; }
public
string
IsoCode3 {
get
;
set
; }
public
string
IsoCodeHash {
get
;
set
; }
public
string
CallingCodeOne {
get
;
set
; }
public
string
CallingCodeTwo {
get
;
set
; }
public
string
CurrencyName {
get
;
set
; }
public
string
CurrencySymbol {
get
;
set
; }
public
List<State> States {
get
;
set
; }
Entity Model for State
[ScaffoldColumn(
false
)]
public
int
StateId {
get
;
set
; }
public
string
Name {
get
;
set
; }
public
bool
IsCapital {
get
;
set
; }
[ScaffoldColumn(
false
)]
public
int
CountryId {
get
;
set
; }
public
Country Country {
get
;
set
; }
States Controller deriving from ODataController (It's a separate project)
private
DataAccess.Helper.DatabaseContext _dbContext;
public
StatesController()
{
DataAccess.MyApp.StartUp.Initialize();
const
string
dataSource =
"My-PC\\SQLEXPRESS"
;
const
string
initialCatalog =
"BS"
;
var connString = SqlConnection.CreateConnectionString(
""
, dataSource, initialCatalog);
_dbContext =
new
DatabaseContext(connString);
}
// GET odata/Countries
[EnableQuery]
public
System.Linq.IQueryable<State> GetStates()
{
return
_dbContext.States;
}
public
IHttpActionResult Put([FromODataUri]
int
key, State entity)
{
if
(!ModelState.IsValid)
return
BadRequest(ModelState);
if
(key != entity.StateId)
return
BadRequest();
_dbContext.States.Attach(entity);
_dbContext.Entry(entity).State = EntityState.Modified;
try
{
_dbContext.SaveChanges();
}
catch
(Exception)
{
if
(!EntityExists(key))
{
return
NotFound();
}
else
{
throw
;
}
}
return
Updated(entity);
}
private
bool
EntityExists(
int
key)
{
return
_dbContext.States.Count(e => e.StateId == key) > 0;
}
public
IHttpActionResult Post(State entity)
{
if
(!ModelState.IsValid)
return
BadRequest(ModelState);
_dbContext.States.Add(entity);
_dbContext.SaveChanges();
return
Created(entity);
}
View (It's in a separate project)
@(Html.Kendo().Grid<SC.BS.EntityModel.State>()
.Name(
"EntityStates"
)
.Columns(col =>
{
col.Bound(e => e.StateId);
col.Bound(e => e.Name).Title(
"State"
).Width(
"200"
);
col.Bound(e => e.IsCapital).Title(
"Capital"
).Filterable(
false
).Width(100).ClientTemplate(
"#= IsCapital ? 'Yes':'No' #"
).HtmlAttributes(
new
{style=
"align=center"
});
col.Bound(e => e.CountryId);
col.Bound(e => e.Country).Title(
"Country"
).ClientTemplate(
"#: Country.ShortName #"
).EditorTemplateName(
"CountriesLookUp"
).Filterable(
false
);
col.Command(cmd =>
{
cmd.Edit();
cmd.Destroy();
}).Width(170);
})
.Scrollable()
.ToolBar(tb => tb.Create().Text(
"New State"
))
.DataSource(ds => ds
.Custom()
.Schema(sch =>
{
sch.Model(m =>
{
m.Id(
"StateId"
);
m.Field(e => e.StateId).Editable(
false
);
m.Field(e => e.CountryId).DefaultValue(1);
//m.Field(e => e.Country).DefaultValue(new SC.BS.EntityModel.Country());
//m.Field("CreatedOn", typeof(DateTime));
});
})
.Type(
"odata-v4"
)
.Transport(tr =>
{
tr.Read(r => r.Url(
"http://localhost:28016/oData/States"
).Data(
"function() {return {'$expand' : 'Country'} }"
));
tr.Create(c => c.Url(
"http://localhost:28016/oData/States"
));
tr.Update(
new
{
url =
new
Kendo.Mvc.ClientHandlerDescriptor
{
HandlerName = @"function(data) {
return
'http://localhost:28016/oData/States('
+ data.StateId +
')'
;
}"
}
});
tr.Destroy(
new
{
url =
new
Kendo.Mvc.ClientHandlerDescriptor
{
HandlerName = @"function(data) {
return
'http://localhost:28016/oData/States('
+ data.StateId +
')'
;
}"
}
});
})
.PageSize(20)
.ServerPaging(
true
)
.ServerSorting(
true
)
.ServerFiltering(
true
)
)
.Pageable()
.Sortable()
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.Editable(e => e.Mode(GridEditMode.InLine)))
CountriesLookUp EditorTemplate
@model SC.BS.EntityModel.Country
@(Html.Kendo().DropDownList().Name(
"Countries"
).DataSource(ds => ds
.Custom()
.Schema(sch =>
{
sch.Model(m =>
{
m.Id(
"CountryId"
);
});
})
.Type(
"odata-v4"
)
.Transport(tr =>
{
tr.Read(r => r.Url(
"http://localhost:28016/oData/Countries"
));
})
)
.DataValueField(
"Country"
)
.DataTextField(
"ShortName"
))
Displaying data works fine, but I'am having trouble updating the State.
message=entity : The property
'Countries'
does not exist on type
'SC.BS.EntityModel.State'
. Make sure to only use property names that are defined by the type.
This is the JSON that is sent on update command.
{
"StateId"
:
"1"
,
"Name"
:
"Delhi"
,
"IsCapital"
:
true
,
"CountryId"
:
"2"
,
"Country"
:{
"CountryId"
:2,
"ShortName"
:
"United States"
,
"LongName"
:
"United States of America"
,
"IsoCode2"
:
"US"
,
"IsoCode3"
:
"USA"
,
"IsoCodeHash"
:
"840"
,
"CallingCodeOne"
:
"1"
,
"CallingCodeTwo"
:
""
,
"CurrencyName"
:
"USD"
,
"CurrencySymbol"
:
"$"
},
"Countries"
:
"United States"
}
I want to persist what child detail grid is open on return to the page. I tried using the localstorage example
var options = kendo.stringify(grid.getOptions())
localStorage.setItem("kendo-grid-options", options);
but this does not seem to keep the open expanded row details.
Is there an event that fires when oi expand a row, then maybe I could use that to record the row number and expand using js when page is loaded, thanks
I have very large data sets I want to display in a grid, and I'd like to use the auto filtering on the column header. But with my large data sets, users will typically want to specify a few filters before getting their data, otherwise the retrieval of the records from the database takes a very long time.
It seems that by default, each filter in the grid is applied immediately. I'd like to allow the user to select multiple filters, and then push a button to trigger the refresh.
Is there a good way to skip the automatic refresh that comes with setting a filter in the grid header?
Hi
I have installed a trial version to have a play around with the Scheduler control.
I have put together a basic ​page, but have a problem when attempting to edit an event. After double clicking on the event, the event dialog opens. Then, whenever I hit Cancel or the close (X) button, I get the following error:
Unhandled exception at line 10, column 30735 in kendo.all.min.js
Javascript runtime error: unable to get property 'uid' of undefined or null reference.
The Save button works fine.
I am using Kendo.Mvc.dll 2015.2.805.545, and Visual Studio 2013.
Any ideas on why this is failing?
Cheers, Jarrod