我有一个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。换句话说,您不是在交换两个项目,而是在向下推下面的项目部分编号。
这是我使用的算法。
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();
}