Telerikのデモページに示されているように、editable: "popup"
を使用してグリッドを編集します。 グリッドを編集した後、グリッドを更新します。グリッドには、グリッドを編集した後に呼び出されるイベントがありますか?
データバインドイベントを使用しようとしました。このイベントでは、データソースを読み取らせますが、グリッドを更新するのは無限ループであることがわかります。 saveChangesイベントを使用しようとしましたが、機能しません。
@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.ProductViewModel>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.ProductName);
columns.Bound(p => p.UnitPrice).Width(100);
columns.Bound(p => p.UnitsInStock).Width(100);
columns.Bound(p => p.Discontinued).Width(100);
columns.Command(command => { command.Edit(); command.Destroy(); }).Width(160);
})
.ToolBar(toolbar => toolbar.Create())
.Editable(editable => editable.Mode(GridEditMode.PopUp))
.Pageable()
.Sortable()
.Scrollable()
.Events(events => events.Change("saveChanges "))
.HtmlAttributes(new { style = "height:430px;" })
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Events(events => events.Error("error_handler"))
.Model(model => model.Id(p => p.ProductID))
.Create(update => update.Action("EditingPopup_Create", "Grid"))
.Read(read => read.Action("EditingPopup_Read", "Grid"))
.Update(update => update.Action("EditingPopup_Update", "Grid"))
.Destroy(update => update.Action("EditingPopup_Destroy", "Grid"))
))
グリッドのデータソースのSyncイベントをサブスクライブし、そのデータソースの読み取りメソッドを呼び出すことができます。
.Events(events => events.Error("error_handler").Sync("sync_handler"))
function sync_handler(e) {
this.read();
}
イベントをデータソースに追加
.DataSource(dataSource => dataSource.Ajax(
.Events(e => e.RequestEnd("PowerPlantProduction.onRequestEnd"))**
)
Javascript:
onRequestEnd: function (e) {
if (e.type == "update") {
if (!e.response.Errors) {
e.sender.read();
}
}
},
サーバー側の検証を使用している場合、受け入れられた回答は予期しない動作を引き起こす可能性があります。同期イベントは、リクエストが成功したかどうかに関係なくサーバーに更新が送信されるたびにトリガーされるため、リクエストがサーバー側の検証エラー(またはその他のエラー)をトリガーした場合、グリッドは更新され、変更は失われます。まだこれを見ていますが、私が見つけた最良の解決策は、データソースのonRequestEnd()
イベントを使用して、手動でエラーをチェックすることです。
例えば:
function onRequestEnd(e)
{
var grid = $("#grid").data("kendoGrid");
var data = grid.dataSource;
if (e.type == "create" || e.type == "update") {
if (!e.response.Errors)
data.read();
else console.log("I had some issues");
}
}
これによりグリッドが更新されます
var grid = $("#Name").data("kendoGrid");
grid.dataSource.page(1);
.page(1)が機能しない場合は、.readを試してください。ただし、
グリッドを更新する場合に使用します。
$("#WorkOrderDetails").data("kendoGrid").refresh();
これは非常に古い質問であることに同意しますが、残念ながら私は数日前にこのエラーの犠牲者でもありました。私のシナリオは
最後に、問題の解決策を得たと思いますデータベースに挿入してそのオブジェクトを返すときに、レコードに主キー値を設定していませんでした
以下は私の剣道グリッドコードです
@(Html.Kendo().Grid<TeamMemberViewModel>()
.Name("Grid")
.Columns(columns =>
{
columns.Bound(p => p.abcd);
columns.Bound(p => p.abcd_id).Hidden();
columns.Bound(p => p.abcd12_id).Hidden();
columns.Command(command =>
{
command.Edit();
command.Destroy();
});
})
.ToolBar(toolbar =>
{
if (ViewBag.IsAddAllowed)
{
toolbar.Create().Text("Add new");
}
// toolbar.Save().SaveText("Save Changes");
})
.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("ABCD")
)
.Pageable()
.Navigatable()
.Sortable()
.Scrollable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.ServerOperation(false)
.Events(events =>
{
events.Error("error_handler");
events.RequestEnd("request_end");
}
)
.Model(model =>
{
model.Id(p => p.primarykey_id);
model.Field(p => p.abcd);
})
.Create("ABCD_Create", "TeamMember", new { id = Model.abcd_id})
.Read("ABCD_Read", "TeamMember", new { id = Model.abcd_id })
.Update("ABCD_Update", "TeamMember", new { id = Model.abcd_id })
.Destroy("TeamMember_Destroy", "TeamMember", new { id = Model.hackathon_id })
)
)
以下はエラー処理コードです
function error_handler(e) {
if (e.errors) {
var message = "Errors:\n";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
$(".errorMessage").text(message);
alert(message);
}
}
function request_end(e) {
switch (e.type) {
case "create":
if (e.Errors == undefined && e.response.Total > 0) {
// alert("Saved Successfully");
$(".errorMessage").text("Saved Successfully");
}
break;
case "update":
if (e.Errors == undefined && e.response.Total > 0) {
// alert("Updated Successfully");
$(".errorMessage").text("Updated Successfully");
}
break;
case "destroy":
if (e.Errors == undefined && e.response.Total > 0) {
// alert("Deleted Successfully");
$(".errorMessage").text("Deleted Successfully");
}
break;
default:
$(".errorMessage").text("");
break;
}
return true;
}
サーバーコード
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ABCD_Create([DataSourceRequest] DataSourceRequest request, MyViewModel my, short abcd_id)
{
if (my != null && ModelState.IsValid)
{
MY tm = Mapper.Map<MyViewModel>(my);
tm.abcd_id = abcd_id;
try
{
repo.Create(tm);
my.primarykey_id = tm.primarykey_id; ///This is most important
}
catch (Exception ex)
{
ModelState.AddModelError("Duplicate Value Found", string.Format("error: {0} already exists", my.abcd));
}
}
else
{
ModelState.AddModelError("Error", "Not valid please send data again");
}
return Json(new[] { my }.ToDataSourceResult(request, ModelState));
}
これが誰かを助けることを願っています
他の誰かがこれを行う方法を知る必要がある場合に備えて。作成および更新ビットに「完全な」機能を含めることができます。
transport: {
read: {
url: "http://myurl.json"
},
create: {
url: "http://mycreate.json",
type: "POST",
complete: function(e) {
$("#grid").data("kendoGrid").dataSource.read();
}
},
編集ボタンのクリックで関数を呼び出すことができ、その中でグリッドを更新できます:
function EditRow(){
var grid = $("#YourGridName").data("kendoGrid");
grid.dataSource.read();
}
.sync: function (e) {
this.read();
},
ポップアップ編集モードを持つajax mvc剣道グリッドでAutoSync(true)
を使用すると、ポップアップがまったく表示されなくなります。
だから私はこれを使う
function onRequestEnd(e) {
if(e.type == "create" || e.type == "destroy" || e.type == "update") {
setTimeout(function myfunction() {
$("#mygrid").data("kendoGrid").dataSource.read();
}, 1000);
}
}
タイムアウトは、クラッディング操作を重ねないようにすることです。
新しいアイテムを作成した後、グリッドを更新する方法を見つけようとしてきました。シナリオは次のとおりです。クライアントでアイテムを作成し、サーバーにリクエストを送信し、レスポンスを受信してクライアントを更新します。 (または、グリッドがサーバー側の作成関数で返すアイテムを使用していない理由を理解することはできません)
この投稿 はrequestEnd
イベントに言及していますが、カミソリでは公開されていません。このイベントは、要求が終了した後、つまりサーバーがイベントを処理した後に発生するようです。そのため、クライアントで作成された新しいオブジェクトは、処理のためにサーバーに既に送信されます。クライアントはデータを失うことなく最新情報を要求できます。グリッドデータソースオブジェクトはページの読み込み時に未定義だったため、最終的に.Change
イベントは、requestEnd
イベントをフックします。
@(Html.Kendo().Grid
.Name("user-grid")
...
.Pageable(pageable => pageable
...
.Events( e => e.Remove("grid_remove").Change("hook_request_end"))
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Model(m =>
{
m.Id(vm => vm.DocumentId);
m.Field<DateTime>("LastModified").Editable(false);
})
.Read(a => a.Action("KList", "Controller"))
.Create(a => a.Action("KCreate", "Controller"))
.Update(a => a.Action("KUpdate", "Controller"))
)
そして、javascript:
var requestEndHooked = false;
function hook_request_end()
{
if (requestEndHooked == true)
{
return;
}
requestEndHooked = true;
$("#user-grid").data("kendoGrid").dataSource.bind("requestEnd", dataSource_requestEnd);
}
function dataSource_requestEnd(e)
{
try
{
if (e.type == "create")
{
$("#user-grid").data("kendoGrid").dataSource.read();
}
}
catch (e)
{
}
}
もっと良い方法があれば、知りたいです。
質問に答えるために、「作成」以外のイベントがあります:「読み取り」、「更新」