我在屏幕上有一个产品图片列表。当用户将图像拖放到度假村时,我可以访问oldIndex和newIndex。
让我说我有以下内容:
产品1 [指数:0]
产品2 [指数:1]
产品3 [指数:2]
产品4 [指数:3]
产品5 [指数:4]
产品6 [指数:5]
用户决定将Product2放在Product4
之前我试图弄清楚我的db update语句是什么。我正在阅读另一篇文章,看到有人说你应该更新所有> = newIndex的产品的SortOrder字段,然后再将新产品更新为newIndex。
关于这一点似乎对我而言,这将留下以下内容:
产品1 [指数:0]
产品2 [指数:2]
产品3 [指数:3]
产品4 [指数:4]
产品5 [指数:5]
产品6 [指数:6]
我真的想要实现这一点,我的索引保持完美的顺序,没有间隙。有什么建议吗?
答案 0 :(得分:1)
IF OBJECT_ID('tempdb..#Product') IS NOT NULL
DROP TABLE #Product
CREATE TABLE #Product(
Name VARCHAR(100) NOT NULL
,SortOrder INT NOT NULL
)
INSERT INTO #Product (Name, SortOrder)
VALUES
('Product1', 0)
,('Product2', 1)
,('Product3', 2)
,('Product4', 3)
,('Product5', 4)
,('Product6', 5)
DECLARE
@NewIndex INT
,@OldIndex INT
SET @OldIndex = 4 --'Product5'
SET @NewIndex = 2 -- After 'Product2'
IF @NewIndex < @OldIndex -- Move UP
UPDATE #Product
SET SortOrder = CASE
WHEN SortOrder = @OldIndex THEN @NewIndex
ELSE SortOrder + 1
END
WHERE SortOrder BETWEEN @NewIndex AND @OldIndex;
ELSE -- Move DOwn
UPDATE #Product
SET SortOrder = CASE
WHEN SortOrder = @OldIndex THEN @NewIndex
ELSE SortOrder - 1
END
WHERE SortOrder BETWEEN @OldIndex AND @NewIndex;
SELECT * FROM #Product ORDER BY SortOrder
答案 1 :(得分:1)
所以我写了一个虚空来处理咕噜咕噜的工作。由于我需要使用多种类型的实体(所有实体都有SortOrder
列)执行此操作,因此我创建了一个名为ISortable
的接口,其中包含SortOrder
列。如果您只是使用一个db表执行此操作,则可以将ISortable
的任何实例替换为您的实体所命名的任何实例。
在这个空白之外需要做的是:
从数据库获取项目并将其旧排序顺序存储在变量(oldSortOrder
)中,然后设置项目的新排序顺序(newSortOrder
),然后将变量设置为全部其他项目不是您刚刚更新的项目(list
)。这也说明了从数据库中删除的项目,只需在您的ajax调用中将newSortOrder
设置为0
。
WebApi方法:
// Code is activated when accessed via http PUT
public void PutItem(int itemId, int newSortOrder)
{
// using makes sure Context is disposed of properly
using (var Context = new MyDbContext())
{
var oldSortOrder = 0;
IEnumerable<ISortable> itemsToReorder = null;
// Get moved item from database
var item = Context.Items.FirstOrDefault(x => x.ItemId == itemId);
// Before we set the new sort order, set a variable to the
// old one. This will be used to reorder the other items.
oldSortOrder = item.SortOrder;
// Get all items except the one we grabbed above.
itemsToReorder = Context.Items.Where(x => x.ItemId != itemId);
// Delete if the item is set for deletion (newSortOrder = 0)
if (newSortOrder == 0)
{
Context.Items.Remove(item);
}
// Otherwise, set the new sort order.
else
{
item.SortOrder = newSortOrder;
}
// Pass other items into reordering logic.
ReOrder(itemsToReorder, oldSortOrder, newSortOrder);
// Save all those changes back to the database
Context.SaveChanges();
}
}
重新排序无效
public static void ReOrder(IEnumerable<ISortable> list,
int oldSortOrder,
int newSortOrder)
{
IEnumerable<ISortable> itemsToReorder;
// Pare down the items to just those that will be effected by the move.
// New sort order of 0 means the item has been deleted.
if (newSortOrder == 0)
{
itemsToReorder = list.Where(x => x.SortOrder > oldSortOrder);
}
else
{
// This is just a long inline if statement. Applies Where()
// conditions depending on the old and new sort variables.
itemsToReorder = list.Where(x => (oldSortOrder < newSortOrder
? x.SortOrder <= newSortOrder &&
x.SortOrder > oldSortOrder
: x.SortOrder >= newSortOrder &&
x.SortOrder < oldSortOrder));
}
foreach (var i in itemsToReorder)
{
// Original item was moved down
if (newSortOrder != 0 && oldSortOrder < newSortOrder)
{
i.SortOrder -= 1;
}
// Original item was moved up
else if (newSortOrder != 0 && oldSortOrder > newSortOrder)
{
i.SortOrder += 1;
} // Original item was removed.
else
{
i.SortOrder -= 1;
}
}
}
如果您需要澄清,请告诉我。我几乎可以肯定我没有充分解释一切。