【问题标题】:Kendo Sortable integrated with a grouped GridKendo Sortable 与分组网格集成
【发布时间】:2015-05-27 14:57:23
【问题描述】:

这是我的视图,其中我有一个与 Grid 集成的 Sortable。这很好用,但问题是 Grid 是分组的。而且,我希望每个组都有自己的可排序功能,这意味着用户不应该能够将行从一个组拖放到另一个组。我怎么做?我必须为每个组设置单独的 Sortables 吗?

@(Html.Kendo().Grid<QRMT.ViewModels.SubsystemViewModel>()
    .Name("subsystems")
    .ToolBar(toolbar => toolbar.Create().Text("Add new Subsystem"))
    .Columns(columns =>
    {
        columns.ForeignKey(c => c.SystemId, new SelectList(ViewBag.Systems, "Value", "Text")).Hidden();
        columns.Bound(c => c.SubsystemCode);
        columns.Bound(c => c.SubsystemDesc);
        columns.Command(c => { c.Edit(); c.Destroy(); }).Width(200);
    })
    .Editable(e => e.Mode(GridEditMode.PopUp).Window(window => window.Width(500)))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(events => events.Sync("onSync").Error("onError"))
        .Model(model =>
        {
            model.Id(m => m.SubsystemId);
        })
        .Group(group => group.Add(m => m.SystemId))
        .Create(create => create.Action("Add", "Subsystems"))
        .Read(read => read.Action("Read", "Subsystems"))
        .Update(update => update.Action("Update", "Subsystems"))
        .Destroy(destroy => destroy.Action("Delete", "Subsystems"))
    )
    .Events(events => events.Edit("onEdit"))
)


@(Html.Kendo().Sortable()
    .For("#subsystems")
    .Filter("table > tbody > tr:not(.k-grouping-row)")
    .Cursor("move")
    .HintHandler("noHint")
    .PlaceholderHandler("placeholder")
    .ContainerSelector("#subsystems tbody")
    .Events(events => events.Change("onChange"))
)

<script type="text/javascript">
    var noHint = $.noop;

    function placeholder(element) {
        return element.clone().addClass("k-state-hover").css("opacity", 0.65);
    }

    function onEdit(e) {
        if (e.model.isNew()) {
            $('.k-window-title').text("Add");
        }
    }

    function onSync(e) {
        this.read();
    }

    function onError(e) {
        alert(e.errors);
    }

    function onChange(e) {
        var grid = $("#subsystems").data("kendoGrid"),
            skip = grid.dataSource.skip(),
            oldIndex = e.oldIndex + skip,
            newIndex = e.newIndex + skip,
            data = grid.dataSource.data(),
            dataItem = grid.dataSource.getByUid(e.item.data("uid"));

        grid.dataSource.remove(dataItem);
        grid.dataSource.insert(newIndex, dataItem);
    }
</script>

<style>
    .k-grid tbody tr:not(.k-grouping-row) {
        cursor: move;
    }
</style>

【问题讨论】:

    标签: asp.net-mvc kendo-ui kendo-grid kendo-asp.net-mvc kendo-sortable


    【解决方案1】:

    Kendo 可排序小部件不适用于分组网格。 这是写在known limitations section of Sortable-Grid integration help topic

    【讨论】:

      【解决方案2】:

      Kendo 说在分组网格上使用 KendoSortable 是不可能的,但我确实找到了一个可能的解决方案!在您的问题中,您将自己限制为只能在同一组中拖动。如果您有一个字段来存储订单并正确排序,那没关系。

      我在下面发布的解决方案是为一个角度实现而制作的,但 onchange 事件都是 javascript,所以我认为这可以重新设计。 (tr filter [data-uid] 将确保没有分组行被“选择”)

      • 首先正确编号所有行,可能需要启动 SortOrder 值
      • 然后在移动的行上设置新索引
      • 然后根据需要进行更改
      • 然后resort网格。这里可能需要硬编码的字段名而不是“primarySortField”
      $scope.initMySortOrderGrouped = function(grid, myDatasource, primarySortField) {
        grid.table.kendoSortable({
          filter: ">tbody>tr[data-uid]",
          hint: $.noop,
          cursor: "move",
          placeholder: function(element) {
            return element.clone().addClass("k-state-hover").css("opacity", 0.65);
          },
          container: "#" + grid.element[0].id + " tbody",
          change: function(e) {
            /*Needed on grid for sorting to work conditionally*/
            if (grid.canWrite) {
              var skip = 0,
                oldIndex = e.oldIndex + skip,
                newIndex = e.newIndex + skip,
                view = myDatasource.view(),
                dataItem = myDatasource.getByUid(e.item.data("uid")); 
              /*retrieve the moved dataItem*/
      
              /*set initial values where needed*/
              var countRows = 0;
              for (var i = 0; i < view.length; i++) {
                for (var j = 0; j < view[i].items.length; j++) {
                  if (view[i].items[j].SortOrder != countRows + j) {
                    view[i].items[j].SortOrder = countRows + j;
                    view[i].items[j].dirty = true;
                  }
                }
                countRows += view[i].items.length
              }
      
              dataItem.SortOrder = newIndex; /*update the order*/
              dataItem.dirty = true;
      
              countRows = 0;
              /*shift the order of the records*/
              for (var i = 0; i < view.length; i++) {
                for (var j = 0; j < view[i].items.length; j++) {
                  if (oldIndex < newIndex) {
                    if (countRows + j > oldIndex && countRows + j <= newIndex) {
                      view[i].items[j].SortOrder--;
                      view[i].items[j].dirty = true;
                    }
                  } else {
                    if (countRows + j >= newIndex && countRows + j < oldIndex) {
                      view[i].items[j].SortOrder++;
                      view[i].items[j].dirty = true;
                    }
                  }
                }
                countRows += view[i].items.length
              }
              myDatasource.sync(); 
              /*submit the changes through the update transport and refresh the Grid*/
            }
            myDatasource.sort([{
              field: primarySortField,
              dir: "asc"
            }, {
              field: "SortOrder",
              dir: "asc"
            }]);
          }
        });
      };
      

      这将允许您将项目拖到它的组上,数字将远高于或低于组中的数字,但结果排序将正确显示!

      我讨厌程序员说某事是不可能的......

      【讨论】:

      • 好吧,感谢您的建议,但有一个更简单的解决方法。我只是在每一行添加了向上和向下箭头,以在组内向上和向下移动记录。我不必使用 Kendo Sortable 功能。
      • 嗯,你的问题是使用拖放。你接受的答案甚至不正确,如我所见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多