Hi all, I've problem to load drop down list inside kendo grid foreign key column:
My configuration is the following:
I have a view
@model Pomini.DeviceMonitor.Configurator.Models.Device.DeviceSearchModel
@{
ViewBag.Title = "Device";
Layout = "~/Views/Shared/_DefaultLayoutForKendoGrid.cshtml";
}
@section PageScript {
<
script
src
=
"~/Scripts/device.js"
></
script
>
}
<
div
class
=
"row"
>
<
div
class
=
"col-md-12"
>
<
h1
>Device List of @Model.RollshopName</
h1
>
@(Html.Kendo().Grid<
Pomini.DeviceMonitor.Business.Device
>(Model.DeviceList)
.Name("DeviceGrid")
.Columns(columns =>
{
columns.Bound(p => p.DeviceID);
columns.Bound(p => p.SerialNumber);
columns.ForeignKey(p => p.DeviceType, @Model.DeviceTypeEnumList, "Value", "Name");
columns.Template(@<
text
></
text
>).ClientTemplate(@Html.ActionLink("View Configuration", "Index", "Item", new { deviceId = "#=DeviceID#" }, null).ToHtmlString());
})
.Pageable()
.Sortable(sortable =>
{
sortable.Enabled(true);
sortable.SortMode(GridSortMode.SingleColumn);
})
.Filterable()
.ToolBar(toolbar =>
{
toolbar.Create();
toolbar.Save();
})
.Editable(editable =>
{
editable.Mode(GridEditMode.InCell);
editable.Enabled(true);
editable.DisplayDeleteConfirmation(true);
})
.Navigatable()
.DataSource(dataSource =>
dataSource.Ajax()
.Batch(true)
.Model(model =>
{
model.Id(p => p.DeviceID);
model.Field(p => p.DeviceID).Editable(false);
})
.Read(read => read.Action("Device_Read", "Device"))
.Create(create => create.Action("Device_Create", "Device", new { rollshopId = @Model.RollshopId }))
.Update(update => update.Action("Device_Update", "Device"))
.Sort(sort => sort.Add("DeviceID").Ascending())
)
)
</
div
>
</
div
>
My viewmodel page, from which I retrieve all data I need in my view
public
class
DeviceSearchModel
{
public
DeviceSearchModel(
int
rollshopID)
{
this
.RollshopName = Business.Rollshop.Query(x => x.ID == rollshopID).FirstOrDefault() !=
null
? Business.Rollshop.Query(x => x.ID == rollshopID).FirstOrDefault().Name :
""
;
this
.DeviceTypeEnumList = Business.Helper.GetListFromEnum<DeviceTypeDescriptions>();
this
.DeviceList = Business.Device.Query(x => x.RollshopID == rollshopID);
this
.RollshopId = rollshopID;
}
public
string
RollshopName {
get
;
private
set
; }
public
List<EnumModel> DeviceTypeEnumList {
get
;
set
; }
public
IEnumerable<Business.Device> DeviceList {
get
;
private
set
; }
public
int
RollshopId {
get
;
private
set
; }
}
I've also the class that own the structure of my dropdown items:
public
class
EnumModel
{
public
int
Value {
get
;
set
; }
public
string
Name {
get
;
set
; }
}
This is my Enum class:
public
enum
DeviceTypeDescriptions
{
[Display(Name =
"Starndard Grinder"
)]
StandardGrinder = 0,
[Display(Name =
"Pomini digital texturing"
)]
PDT = 1,
MWGrinder = 2,
BladeGrinder = 3
}
And this is the method I use to populate my dropdownlist item's from my Enum:
public
static
List<EnumModel> GetListFromEnum<T>()
{
return
Enum.GetValues(
typeof
(T))
.Cast<T>()
.Select(x =>
new
EnumModel()
{
Value = Convert.ToInt32(x),
Name = x.ToString()
}).ToList();
}
This is my Device class: in this class I retrieve data which populate the grid:
public
sealed
class
Device : IBusinessDomain
{
public
int
DeviceID {
get
;
internal
set
; }
public
int
RollshopID {
get
;
internal
set
; }
public
string
SerialNumber {
get
;
set
; }
public
int
DeviceType {
get
;
set
; }
//public DeviceTypeDescriptions DeviceTypeDescription { get; set; }
public
Lazy<Business.Rollshop> Rollshop {
get
;
internal
set
; }
public
Lazy<IEnumerable<Business.Item>> ItemList {
get
;
internal
set
; }
public
static
IEnumerable<Device> Query(Expression<Func<Data.MainDB.Device,
bool
>> where =
null
)
{
using
(var db =
new
Repository())
{
IEnumerable<Device> result = db.Device.Enumerate(where).Select(x => (Device) x).ToArray();
return
result;
}
}
public
static
explicit
operator
Device(Data.MainDB.Device arg)
{
var value = Mapper.Map<Device>((Data.MainDB.Device) arg);
return
value;
}
}
And this is my database model object:
public
partial
class
Device
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage"
,
"CA2214:DoNotCallOverridableMethodsInConstructors"
)]
public
Device()
{
this
.Item =
new
HashSet<Item>();
}
public
int
ID {
get
;
set
; }
public
string
SerialNumber {
get
;
set
; }
public
int
DeviceType {
get
;
set
; }
public
System.DateTime CreationDate {
get
;
set
; }
public
System.DateTime LastUpdateDate {
get
;
set
; }
public
int
RollshopID {
get
;
set
; }
public
virtual
Rollshop Rollshop {
get
;
set
; }
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage"
,
"CA2227:CollectionPropertiesShouldBeReadOnly"
)]
public
virtual
ICollection<Item> Item {
get
;
set
; }
}
Ok so now this is my situation. I hope is clear.
The behaviour
in this situation is that grid will be populated well on load, but when i
click cell to edit content, dropdown does'n appear and i can't edit
cell (no textbox also appear) (only for DeviceType column, for
SerialNumber column all works).
If in my grid I change bound to foreign key in this way:
columns.ForeignKey(p => p.DeviceType, @Model.DeviceTypeEnumList, "Name", "Name");
when i load my grid, DeviceType column will remain blank (not bound
to it's value), but when i click on this the cell enter correctly in
edit mode and show my dropdown. Then if I choose an item in the
dropdown, when i click outside cell, this cell return blank (item I
choosen is not shown in grid).
I hope is all clear!
Thank