2017-08-29 127 views
0

我有一個具有排序事件的多個劍道MVC網格,因此如果在一個網格上應用排序,它也適用於所有其他網格。這似乎工作正常,直到我需要重寫排序功能和排序2列。排序事件不適用於引發事件的網格

下面的代碼現在將所有其他網格按2列進行排序,但不會在單擊列進行排序時引發事件的網格。

有沒有辦法解決這個問題,使點擊的網格也排序正確?

的Razer:

for (int i = 0; i < grids.Count; i++) 
{ 
    @(Html.Kendo().Grid(dataXYZ) 
      .Name($"grid{i}") 
      .Deferred() 
      .Columns(columns => 
      { 
       // Columns 

      }) 
      .Sortable(sortable => 
      { 
       sortable.SortMode(GridSortMode.SingleColumn); 
      }) 
      .Events(events => events 
       .Sort("onSorting") 
       .DataBound("dataBound") 
     ) 
      .DataSource(dataSource => dataSource 
       .Ajax() 
       .PageSize(50) 
       .ServerOperation(false) 
     ) 

    ) 
} 

的javascript:

<script> 


    function onSorting(arg) { 
     $("div[data-role=grid]").each(function() { 
      var grid = $(this).data("kendoGrid"); 

      var dsSort = []; 
      dsSort.push({ field: "SortColumnHelper", dir: "desc" }); 
      dsSort.push({ field: arg.sort.field, dir: arg.sort.dir }); 

      grid.dataSource.sort(dsSort); 

     }); 
    } 


</script> 

編輯:我覺得這是怎麼回事是網格進行排序之前排序事件被稱爲,所以代碼的作品,但那麼真正的排序事件代碼運行後發生。

+0

你能不能您的排序事件添加到數據源,而電網?沒有檢查,但它肯定會解決你的問題,如果它允許你 –

回答

0

我已經設法做到這一點,dataBound事件在排序後觸發,因此每個網格也可以再次循環並捕獲未排序的網格。

<script> 

    function onSorting(arg) { 
     $("div[data-role=grid]").each(function() { 
      var grid = $(this).data("kendoGrid"); 

      grid.dataSource.sort({}); 
      var dsSort = []; 
      dsSort.push({ field: "SortColumnHelper", dir: "desc" }); 
      dsSort.push({ field: arg.sort.field, dir: arg.sort.dir }); 
      grid.dataSource.sort(dsSort); 


     }); 
    } 

    function dataBound(arg) { 

     $("div[data-role=grid]").each(function (e) { 
      var grid = $(this).data("kendoGrid"); 
      var gridData = grid.dataSource.view(); 

      var sort = grid.dataSource.sort(); 
      if (sort != null && sort.length > 0 && sort.length <= 1) { 

       var sortedField = sort[0].field; 
       var sortedDir = sort[0].dir; 
       if (sortedField != "SortColumnHelper") { 

        //console.log(this.id + " " + sortedField + " " + sortedDir); 
        var dsSort = []; 
        dsSort.push({ field: "SortColumnHelper", dir: "desc" }); 
        dsSort.push({ field: sortedField, dir: sortedDir }); 
        grid.dataSource.sort(dsSort); 
       } 
      } 

     }); 
    } 

</script> 

這裏的關鍵是,那種長度應的上限進行檢查,否則將排序的重新觸發DataBound事件然後再打等,這將創建一個溢出錯誤。

if (sort != null && sort.length > 0 && sort.length <= 1)

本質上講,這檢查網格已在1列進行排序只,然後在2列應用排序。

這似乎有點「哈克」,但可以;噸找到另一種方式來做到這一點的MVC劍道文檔