Features

一括更新

一括更新

このサンプルは、MultiRowのデータをサーバーに対して更新する一括更新モードを示します。

機能

説明

MultiRowコントロールでは、Excel形式の高速なセル内編集が組み込みでサポートされています。
ユーザーは、任意のセルでキー入力するだけで編集を開始できます(クイック編集モード)。あるいは、[F2]キーを押すか、セルをダブルクリックすることで、編集を開始することもできます(完全編集モード)。
余分な列を追加して、そこに表示モードと編集モードを切り替えるための[編集]ボタンを置く必要はありません。

データをサーバーに対して更新するモードは2つあります。

標準モード

このデフォルトのモードでは、更新または作成された項目は、対応する行の編集が終了すると、サーバーにコミットされます。
削除された行は、即座にサーバーにコミットされます。

データを更新する場合は、更新アクションURLを提供する必要があります。データを追加または削除する場合は、作成または削除アクションURLを提供する必要があります。
その後、対応するアクションでデータを編集します。

一括更新モード

このモードでは、ユーザーは複数の項目を更新、作成、または削除し、すべての変更を一度にデータソースにコミットできます。
複数の変更のコミットは、グリッドデータをソート、ページング、またはフィルタ処理して行ったり、ボタンを1回クリックするだけで行うことができます。

このモードでは、一括編集アクションURLを提供する必要があります。

メモ: ソート/フィルタ/ページ操作中にデータの更新を無効にするには、MultiRowのItemSourceDisableServerReadプロパティをTrueに設定します。
これにより、クライアント側のソート、フィルタ処理、ページングが有効になり、collectionViewのcommitメソッドがクライアント側から明示的に呼び出されたときにのみデータが送信されます。

using System.Data.Entity.Validation;
using MultiRowExplorer.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using C1.Web.Mvc.Serialization;
using C1.Web.Mvc;
using System.Data;
using System.Data.Entity;

namespace MultiRowExplorer.Controllers
{
    public partial class MultiRowController : Controller
    {
        //
        // GET: /BatchEditing/

        public ActionResult BatchEditing(CollectionViewRequest<Supplier> requestData)
        {
            return View(db.Suppliers.ToList());
        }

        public ActionResult MultiRowBatchEdit([C1JsonRequest]CollectionViewBatchEditRequest<Supplier> requestData)
        {
            return this.C1Json(CollectionViewHelper.BatchEdit(requestData, batchData =>
            {
                var itemresults = new List<CollectionViewItemResult<Supplier>>();
                string error = string.Empty;
                bool success = true;
                try
                {
                    if (batchData.ItemsCreated != null)
                    {
                        batchData.ItemsCreated.ToList().ForEach(st =>
                        {
                            db.Suppliers.Add(st);
                            itemresults.Add(new CollectionViewItemResult<Supplier>
                            {
                                Error = "",
                                Success = ModelState.IsValid,
                                Data = st
                            });
                        });
                    }
                    if (batchData.ItemsDeleted != null)
                    {
                        batchData.ItemsDeleted.ToList().ForEach(supplier =>
                        {
                            var fSupplier = db.Suppliers.Find(supplier.SupplierID);
                            db.Suppliers.Remove(fSupplier);
                            itemresults.Add(new CollectionViewItemResult<Supplier>
                            {
                                Error = "",
                                Success = ModelState.IsValid,
                                Data = supplier
                            });
                        });
                    }
                    if (batchData.ItemsUpdated != null)
                    {
                        batchData.ItemsUpdated.ToList().ForEach(supplier =>
                        {
                            db.Entry(supplier).State = EntityState.Modified;
                            itemresults.Add(new CollectionViewItemResult<Supplier>
                            {
                                Error = "",
                                Success = ModelState.IsValid,
                                Data = supplier
                            });
                        });
                    }
                    db.SaveChanges();
                }
                catch (DbEntityValidationException e)
                {
                    var errorList = e.EntityValidationErrors.SelectMany(i => i.ValidationErrors).Select(i => i.ErrorMessage).ToList();

                    try
                    {
                        var refreshableObjects = db.ChangeTracker.Entries().Where(c => c.State == EntityState.Modified).ToList();
                        refreshableObjects.ForEach(o => o.Reload());
                    }
                    catch (Exception er)
                    {
                        errorList.Add(er.Message);
                    }

                    error = string.Join(",", errorList);
                    success = false;
                }
                catch (Exception e)
                {
                    error = e.Message;
                    success = false;
                }

                return new CollectionViewResponse<Supplier>
                {
                    Error = error,
                    Success = success,
                    OperatedItemResults = itemresults
                };
            }, () => db.Suppliers.ToList()));
        }
    }
}
@model IEnumerable<Supplier>

@section Styles{
    <style>
        .queryErrorMessage {
            color: #f00;
        }
    </style>
}

@section Scripts{
    <script type="text/javascript">
        function batchUpdate() {
            var batchEditMultiRow = wijmo.Control.getControl('#batchEditMultiRow'),
                cv = batchEditMultiRow.collectionView;
            cv.commit();

            var isChanged = (cv.itemsAdded && cv.itemsAdded.length)
                || (cv.itemsRemoved && cv.itemsRemoved.length)
                || (cv.itemsEdited && cv.itemsEdited.length);
            if (isChanged) {
                setQueryMessage('Updating...');
            } else {
                setQueryMessage('No changes.');
            }

        }

        function onQueryComplete(sender, e) {
            if (e.result.success) {
                setQueryMessage('Done.');
            } else {
                setQueryMessage(e.result.error, 'queryErrorMessage');
            }
        }

        function setQueryMessage(message, className) {
            var element = document.getElementById('queryMessage');
            element.innerHTML = message;
            element.className = className;
        }
    </script>
}

<input type="button" value="Update" class="btn" onclick="batchUpdate()" />
<span id="queryMessage"></span>
@(
    Html.C1().MultiRow<Supplier>()
        .Id("batchEditMultiRow")
        .LayoutDefinition(ld =>
        {
            ld.Add().Cells(cells =>
            {
                cells.Add(c => c.Binding("SupplierID").IsReadOnly(true).Format("d").Align("center"));
            });
            ld.Add().Colspan(2).Cells(cells =>
            {
                cells.Add(c => c.Binding("CompanyName").Colspan(2))
                .Add(c => c.Binding("ContactName").Width("150"))
                .Add(c => c.Binding("ContactTitle").Width("200"));
            });
            ld.Add().Colspan(3).Cells(cells =>
            {
                cells.Add(c => c.Binding("Country"))
                .Add(c => c.Binding("Region"))
                .Add(c => c.Binding("City"))
                .Add(c => c.Binding("Address").Colspan(3));
            });
        })
        .Bind(ib => ib.DisableServerRead(true).Bind(Model).BatchEdit(Url.Action("MultiRowBatchEdit")).OnClientQueryComplete("onQueryComplete"))
        .AllowAddNew(true)
        .AllowDelete(true)
        .CssClass("multirow")
)

@section Summary{
    @Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text9)
}

@section Description{
    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text0)</p>

    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text1)</p>
    <h4>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text7)</h4>
    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text2)</p>

    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text3)</p>

    <h4>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text8)</h4>
    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text4)</p>

    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text5)</p>
    <p>@Html.Raw(Resources.MultiRowExplorer.BatchEditing_Text6)</p>

}