Я работаю над сайтом MVC .Net Framework v4.5 с использованием элементов управления Kendo MVC. На одной из страниц используется сетка Kendo, привязанная к модели представления. Когда я редактирую строку, есть поле, в котором используется элемент управления выпадающим списком, и когда выбор изменяется, остальные поля в строке должны быть обновлены, чтобы отразить этот новый выбранный элемент. Я делаю это с помощью вызова JSON, который затем возвращает новую модель представления для этой строки. Однако я не могу понять, как сообщить сетке использовать данные, которые были возвращены из этого вызова JSON. Есть идеи?Обновление строки сетки Кендо при изменении значения столбца
EDIT:
Я установил код. Проблема в том, что я могу получить источник данных сетки для «обновления», но в функции jscript UpdateGridSource, в строке grid.dataSource.read(), сетка теперь выходит из режима редактирования, и если я перейду к редактированию строка, данные вернулся обратно, как это первоначально было
(VIEW)
@(Html.Kendo().Grid<RedFile.Models.QuickQuoteItemView>()
.Name("QuoteItems")
.Columns(c =>
{
c.Bound(p => p.Id).Hidden();
c.Bound(p => p.Description).EditorTemplateName("Combobox");
c.Bound(p => p.ItemQty);
c.Bound(p => p.ItemPrice).Format("{0:c}");
c.Bound(p => p.Total).ClientTemplate("#= kendo.format('{0:c}', Total) #").FooterHtmlAttributes(new { style = "text-align:right;" }).ClientFooterTemplate("#= kendo.format('{0:c}', sum)#").HtmlAttributes(new { style = "text-align:right;" }).Width(100);
c.Command(cmd => { cmd.Edit(); cmd.Destroy(); }).Title("Commands").Width(200);
})
.ToolBar(tb => tb.Create())
.ClientDetailTemplateId("subitems")
.Editable(eb => eb.Mode(GridEditMode.InLine).CreateAt(GridInsertRowPosition.Bottom))
.Events(e=>e.Edit("editGrid"))
.Scrollable()
.DataSource(ds => ds
.Ajax()
.ServerOperation(false)
.Aggregates(a =>
{
a.Add(p => p.LineTotal).Sum();
a.Add(p => p.Total).Sum();
})
.Model(model =>
{
model.Id(p => p.Id);
model.Field(p => p.LineTotal).Editable(false);
model.Field(p => p.ItemPrice).Editable(true);
})
.Read(read => read.Action("GridSelect", "QuickQuote", new { qqid = Model.Id })).ServerOperation(false)
.Create(create => create.Action("GridCreate", "QuickQuote", new { qqid = Model.Id }))
.Update(update => update.Action("GridUpdate", "QuickQuote"))
.Destroy(destroy => destroy.Action("GridDelete", "QuickQuote"))
)
)
<script type="text/javascript">
function dropDownSelectionChanged(e) {
var dataItem = this.dataItem(e.item.index());
UpdateGridSource(dataItem.Value);
}
function UpdateGridSource(DropDownValue) {
var grid = $("#theGrid").data("kendoGrid");
grid.dataSource.transport.options.read.url = '/Controller/refreshGridDataSource?selection=' + DropDownValue;
grid.dataSource.read();
}
</script>
(CONTROLLER)
public JsonResult refreshQuickQuoteTest2([DataSourceRequest] DataSourceRequest request, string selection)
{
QuickQuoteItem qqi = db.QuickQuoteItems.FirstOrDefault(p => p.ItemID == selection);
QuickQuote quickQuoteOriginal = qqi.QuickQuote;
QuickQuoteItemView qqiv = new QuickQuoteItemView();
IEnumerable<QuickQuoteItemView> return2;
qqiv.Id = qqi.Id;
qqiv.ItemID = qqi.ItemID;
qqiv.ItemPrice = qqi.ItemPrice;
if (Session["quickQuote"] != null)
{
QuickQuote qq = (QuickQuote)(Session["quickQuote"]);
if (Session["editingQuickQuoteId"] != null)
{
int row = Convert.ToInt32(Session["editingQuickQuoteId"]);
foreach (var item in qq.QuickQuoteItems)
{
if (item.Id == row)
{
QuickQuoteItem test = new QuickQuoteItem();
StandardItem stdItem = new StandardItem();
stdItem = db.StandardItems.Find(selection);
item.ItemPrice = stdItem.Price;
item.Description = stdItem.Description;
item.ItemID = stdItem.ItemId;
}
}
}
return2 = QuickQuoteItemViewItems(qq);
}
else
{
return2 = QuickQuoteItemViewItems(quickQuoteOriginal);
}
return Json(return2.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
}
Проблема в том, что это не происходит в методе действия обновления. Строка по существу нуждается в обновлении, когда происходит событие изменения выпадающего списка, а не при обновлении строки. На примере сетки веб-сайта Kendo просто снимите столбец «ProductName», используя раскрывающийся список вместо текстового поля, связанного с некоторыми продуктами. Когда продукт изменен, колонки «Цена за единицу» и «Единицы на складе» должны отражать этот недавно выбранный продукт (изменение в соответствии с тем, что выбрано в раскрывающемся списке). Это проясняет ситуацию? – hype
Редактировал мой ответ, чтобы включить как обновить источник данных сетки. Не могли бы вы опубликовать часть своего кода, чтобы мы могли лучше понять проблему? – Longball27
Спасибо Longball, я добавил код. Я обновляю источник данных сетки, но когда вызывается .dataSource.read(), сетка вынимается из режима редактирования, чего не следует делать при изменении значения столбца. Если это единственный способ обновить строку, мне понадобится обходной путь, чтобы вернуть строку в режим редактирования после чтения данных в этом случае. – hype