c# - C# 中的拖放排序 - 最佳算法

标签 c# asp.net drag-and-drop telerik radgrid

我有一个 Telerik RadGrid,它允许用户拖动行来重新排序。服务器端会发生的是每行的一个 int 列将根据它们拖动的位置进行修改,然后我们在屏幕上对这个数字进行排序。

我不知道的是处理后面代码中的重新排序的最简单方法。更新递增/递减拖动行“之间”的任何行的最简单/最佳方法是什么?

编辑:到目前为止我所拥有的

     //We should only allow one section to be dragged at a time
            GridDataItem draggedItem = e.DraggedItems.Single();
            TakeoffSection draggedSection = dc.TakeoffSections.Where(a => a.ID == (long)draggedItem.GetDataKeyValue("ID")).Single(); 
            int origDragSectNo = draggedSection.SectionNo;

            GridDataItem destItem = e.DestDataItem;
            TakeoffSection destSection = dc.TakeoffSections.Where(a => a.ID == (long)destItem.GetDataKeyValue("ID")).Single(); 
            int origDestSectNo = destSection.SectionNo;

            if (e.DropPosition == GridItemDropPosition.Above)
            {
                if (draggedSection.SectionNo < destSection.SectionNo)
                {
                    //They are dragging *down*!
                    draggedSection.SectionNo = destSection.SectionNo;
                    destSection.SectionNo++;

                    foreach (var item in dc.TakeoffSections.Where(a => a.RevisionID == ActiveRevisionID && a.SectionNo < origDestSectNo && a.SectionNo > origDestSectNo))
                        item.SectionNo--;
                    dc.SubmitChanges();
                }
                else
                {
                    //They are dragging *up*

                }
            }

最佳答案

基本上,您需要更新所有项目的SectionNo。换句话说,您不是交换两个项目,而是向下推下面的项目的“SectionNo”。

这是我使用的算法。

protected void RadGrid1_RowDrop(object sender, GridDragDropEventArgs e)
{
   var ids = (from GridDataItem item in this.RadGrid1.Items
            select Convert.ToInt32(item.GetDataKeyValue("ID"))).ToList();

   // Rearranges item in requested order
   if (ids.Count > 0 && e.DestDataItem != null)
   {
     // Get the index of destination row
     int destItem = ids.FirstOrDefault(item => 
       item == Convert.ToInt32(e.DestDataItem.GetDataKeyValue("ID")));

     int destinationIndex = destItem == 0 ? -1 : ids.IndexOf(destItem);

     foreach (GridDataItem draggedItem in e.DraggedItems)
     {
       int draggedId = ids.FirstOrDefault(item => 
         item == Convert.ToInt32(draggedItem.GetDataKeyValue("ID")));

       if (draggedId != 0 && destinationIndex > -1)
       {
         // Remove and re-insert at specified index
         ids.Remove(draggedId);
         ids.Insert(destinationIndex, draggedId);
       }
     }
   }

   // Update each entity's display orders based on the given order
   MyUpdateDisplayOrder(ids);

   RadGrid1.Rebind();
}

关于c# - C# 中的拖放排序 - 最佳算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475920/

相关文章:

c# - 使用精确的 HTML 搜索或将 HTMLElement 转换为 HTMLNode 获取 HtmlAgilityPack 节点

c# - 基于子列表项创建 IGrouping

asp.net - Web表单用户控件事件,需要在页面加载后添加

drag-and-drop - 如何在 KSnapshot 中的 QLabel 上选择带有 QRubberBand 的区域?

c# - 在 C# 中覆盖二元运算符

c# - 具有排名和唯一用户的高分

asp.net - IIS URL 重写仅在一页中工作

asp.net - IIS 中关于 session 超时的查询

javascript - 获取在字段上拖放的资源的 URL

c# - 将单元格从 datagridview 拖放到另一个