Hello.
I use a grid. One of its columns is using client template which is building a DropDownList in the column. I have two problems:
1. When the user sorts the grid the grid is being reinitialized(refreshed) and therefore the client templates are being executed one more time. The input fields are shown, the js function attachDropDown() is executed but the DropDownList is not attached to the input fields. Have i made any mistake or there is more convenient way?
2. When the user selects something in some dropdowns and then he/she decides to sort the column the input data from these DropDownLists is lost because of the reinitialization of the grid.
This is the code for my view.
I use a grid. One of its columns is using client template which is building a DropDownList in the column. I have two problems:
1. When the user sorts the grid the grid is being reinitialized(refreshed) and therefore the client templates are being executed one more time. The input fields are shown, the js function attachDropDown() is executed but the DropDownList is not attached to the input fields. Have i made any mistake or there is more convenient way?
2. When the user selects something in some dropdowns and then he/she decides to sort the column the input data from these DropDownLists is lost because of the reinitialization of the grid.
This is the code for my view.
@{
var serializer =
new
System.Web.Script.Serialization.JavaScriptSerializer();
string
fundsJson = serializer.Serialize(Model.Funds);
}
<script id=
"dropdown-template"
type=
"x-tmpl-mustache"
>
<input type=
"hidden"
name=
"[{{index}}].IndexInXml"
value=
"{{indexInXml}}"
/>
<input id=
"_{{index}}__FundId"
name=
"[{{index}}].FundId"
style=
"width: 300px"
type=
"text"
/>
{{attachComboBox}}
</script>
<script>
var
currentDropDownIndex = 0;
var
fundsJson =@Html.Raw(fundsJson)@(
";"
)
function
attachDropDown(dropDownIndex) {
jQuery(
"#_"
+ dropDownIndex +
"__FundId"
).kendoDropDownList(
{
"dataSource"
: fundsJson,
"dataTextField"
:
"FundName"
,
"height"
: 250,
"headerTemplate"
:
"<div class=\"dropdown-header\"><span class=\"k-widget k-header\">Fund</span><span class=\"k-widget k-header\">Reg</span></div>"
,
"template"
:
"<span class=\"k-state-default\">#: data.FundName #</span><span class=\"k-state-default\">#: data.Reg #</span>"
,
"valueTemplate"
:
"<span>#:data.FundName#</span>"
,
"dataValueField"
:
"FundId"
,
});
}
function
getDropDown(indexInXml) {
var
view = {
index: currentDropDownIndex, indexInXml: indexInXml,
attachComboBox:
function
() {
(
function
(currentDropDownIndex) {
jQuery(
function
() {
console.log(currentDropDownIndex);
attachDropDown(currentDropDownIndex);
});
})(currentDropDownIndex);
}
};
var
template = $(
'#dropdown-template'
).html();
Mustache.parse(template);
var
rendered = Mustache.render(template, view);
currentDropDownIndex++;
return
rendered;
}
function
init() {
currentDropDownIndex = 0;
}
</script>
@(Html.Kendo().Grid<Administration.ViewModels.UnmappedFundInfoViewModel>(Model.ImportedFundData)
.Name(
"funds-mapping"
)
.Sortable()
.Columns(columns =>
{
columns.Bound(c => c.ImportedFundName)
.Title(
"Imported fund name"
);
columns.Bound(c => c.FundId).Title(
"Fund ID"
).Width(100);
columns.Template(@<text> </text>).Title(
"Linked fund"
).ClientTemplate(
"#= getDropDown(data.IndexInXml)#"
);
})
.Scrollable(x => x.Enabled(
true
).Height(
"250px"
))
.DataSource(dataSource =>
dataSource.Ajax().ServerOperation(
false
)
)
.Resizable(resize => resize.Columns(
true
))
)
<script>
$(document).ready(
function
() {
var
grid = $(
"#funds-mapping"
).data(
"kendoGrid"
);
grid.bind(
"dataBinding"
,
function
() {
init();
});
});
</script>