2013-04-14 51 views
0

想象一下,我想通過用下一個或上一個項目替換它的順序來重新排序(更改位置或順序)菜單中的項目。要做到這一點,我使用這樣的代碼如下:將層次表中的某些項目向上或向下移動的最佳方法是什麼?

DECLARE @SO tinyint --, @MenuID uniqueidentifier 
    --SET @MenuID = (Select top 1 MenuID from MenuItems where MenuItemID = @ID) 
    SET @SO = (Select top 1 SO from MenuItems where MenuItemID = @ID and MenuID = @MenuID) 

    if @SO > 1 
    begin 
     UPDATE dbo.MenuItems SET SO = @SO WHERE MenuItemID = (select top 1 MenuItemID from MenuItems WHERE SO = @SO - 1 and MenuID = @MenuID) 
     UPDATE dbo.MenuItems SET SO = @SO - 1 WHERE MenuItemID = @ID 
    END 

此代碼工作正常,每移動一次向上或向下。我有兩個問題:

  1. 有沒有更好的解決方案來做到這一點?
  2. 如果我想將某些物品同時移動到更高或更低的某些步驟,如下所示:?

來源:

> 1 
> 2 
    > 1 
    > 2 
    > 3 
> 3 
> 4 
    > a 
    > b 
> 5 

要:

> 1 
> 2 
    > 1 
    > 2 
    ? a 
    ? 5 
    > 3 
> 3 
> 4 
    > b 

感謝, Kardo

回答

1

您可以把任意兩個條目使用單個查詢這樣的順序:

update dbo.MenuItems 
    set SO = case 
    when MenuItemId = @FirstId then (select SO from dbo.MenuItems where MenuItemId = @SecondId) 
    else (select SO from dbo.MenuItems where MenuItemId = @FirstId) end 
    where MenuItemId in (@Firstid, @SecondId) 

ID的查找可以在查詢之前執行或嵌入到查詢中。

由於您沒有在問題中包含您的表模式,所以查詢可能需要稍微調整。我認爲MenuItemId是獨一無二的,但從您的帖子當然不是很清楚。

+0

感謝您的回答!是的,這些ID是唯一的,但我不知道如何從TreeView獲取下一個或上一個ID。 – Kardo

相關問題