ASP.NET MVC コントロールヘルプ
一括更新
コントロールの使用 > CollectionView > CollectionViewの使用 > サーバー側処理 > 一括更新

CollectionViewHelperには、ユーザーが複数の変更をデータベースにコミットできるBatchEdit要求があります。この例は、コントローラーでBatchEdit要求を定義し、CollectionViewHelperのBatchEdit要求を使用してCollectionViewでデータベースを更新する方法を示します。

次の図は、CollectionViewHelperのBatchEditing要求を設定した後のFlexGridを示しています。ユーザーは、[更新]ボタンをクリックすることにより、変更をサーバーにコミットできます。

FlexGridでBatchEditを実行中に、グリッドでソート、フィルタ処理、またはページングを行うと、サーバーに対して更新要求が行われ、それによって自動的にソースデータベースのデータが更新されます。そのため、ItemSourceDisableServerReadプロパティを必ずtrueに設定してください。

このプロパティの値をtrueに設定すると、一括更新は、[更新]ボタンのCollectionViewのCommitメソッドを明示的に呼び出すことによってのみ行うことができます。次に例を示します。

次のコード例は、BatchEditプロパティとCollectionViewEditRequestを使用して、FlexGridで同時に複数のレコードを更新できるようにする方法を示します。

コードの場合

BatchUpdateController.cs

C#
コードのコピー
private C1NWindEntities db = new C1NWindEntities();

        
public ActionResult Index()
{
    return View(db);
}

public ActionResult GridReadCategory([C1JsonRequest] 
    CollectionViewRequest<Categories> requestData)
{
    return this.C1Json(CollectionViewHelper.Read(requestData, db.Categories));
}


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

        return new CollectionViewResponse<Categories>
        {
            Error = error,
            Success = success,
            OperatedItemResults = itemresults
        };
    }, () => db.Categories.ToList()));
}

この例では、BatchEdit要求はFlexGridのItemsSourceのBatchEditプロパティに割り当てられます。

BatchUpdate.cshtml

Razor
コードのコピー
<input type="button" value="更新" class="btn" onclick="batchUpdate()" />
@(Html.C1().FlexGrid().Id("fGBECView").AutoGenerateColumns(false)
    .Columns(columns => columns
        .Add(c => c.Binding("CategoryID"))
        .Add(c => c.Binding("CategoryName"))
        .Add(c => c.Binding("Description").Width("500")))
    .Bind(ib => ib.Bind(Model.Categories).DisableServerRead(true).BatchEdit(Url.Action("GridBatchEdit")))
    .AllowAddNew(true)
    .AllowDelete(true)
    .CssClass("grid")
)

JS
コードのコピー
<script>
    //一括更新
    function batchUpdate() {
        var batchEditGrid = wijmo.Control.getControl('#fGBECView'),
        cv = batchEditGrid.collectionView;
        cv.commit();
    };
</script>