문제

Sortorder Integer 열이있는 데이터베이스 테이블이 있습니다. 테이블 항목을 추가하고 편집하기위한 UI에는 사용자 가이 항목이 나타나는 위치를 선택할 수 있도록 정수 목록이 있습니다. 내 질문은 목록, {1,2,3,4,5, "Last"}, 사용자가 AA 번호를 선택하면 항목 Sortorder 속성이되기를 원한 다음 해당 'Sortorder'가있는 항목이되기를 원합니다. 현재 'SORTORDER'가 더 낮은 항목에 영향을 미치지 않으면 서 'SORTORDER'가 더 높은 항목뿐만 아니라 1 개 (+= 1)가 부딪칩니다. 현재 vb.net 및 linq를 사용하여 공개 모듈 '유틸리티'가 있습니다.

새로운 myDataconText로 개인 _DB

Public Sub UpdateProductSortOrder(ByVal idx As Integer)

    Dim products = (From p As Product In _db.Products _
        Where p.SortOrder >= idx _
        Select p).ToList()

    For Each p As Product In products
        p.SortOrder += 1
    Next

    _db.SubmitChanges()

End Sub

내가 이것을 할 때 항목을 추가 할 때는 잘 작동하는 것 같습니다.

Protected Overrides Sub AddItem()

    Dim sortOrder As Integer = Int32.Parse(Server.HtmlEncode(ddlNewSortOrder.SelectedValue))

    If (sortOrder >= 1) Then
        Utilities.UpdateProductSortOrder(sortOrder)
    Else
        sortOrder = Utilities.GetNextProductSortOrder()
    End If

    Dim dic As New System.Collections.Specialized.ListDictionary()
    dic.Add("PROD_Description", Server.HtmlEncode(txtNewDescription.Text))
    dic.Add("Abbrev", Server.HtmlEncode(txtNewAbbreviation.Text.ToUpper()))
    dic.Add("SortOrder", sortOrder)

    ProductsGridSource.Insert(dic)

End Sub

하지만 이와 같은 ExisItng 항목을 편집 할 때 가끔 몇 가지 오류가 발생합니다.

보호 된 하위 ProductsGridSource_updating (객체로서 Byval 발신자, Byval e As System.web.ui.webcontrols.linqdatasourceupdateeventArgs) Dim Sortorder as Integer = DirectCast (E.NewObject, 제품) .Sortorder Utilities.upDateProductSorder (Sort Subterder) upDateProductsorder

더 효과적인 모범 사례가 있습니까? 모든 조언에 감사드립니다.

미리 감사드립니다. ~ 샌디에고의 CK

도움이 되었습니까?

해결책

편집의 속임수는 모든 숫자를 업데이트하고 싶지 않으며 변경의 영향을받는 숫자 만 업데이트하고 싶다는 것입니다. 하나의 항목의 경우 쉬운 일이지만 여러 항목을 한 번에 편집하는 경우 Sortorder가 정렬 한 목록에 항목을 저장합니다.

Dim products = (From p As Product In _db.Products _
        Order By p.SortOrder _
        Select p).ToList()

그런 다음 새로운 값에 따라 목록을 재 배열하겠습니다.

// do a RemoveAt first if you need to move an item
products.InsertAt(sortOrder, dic); 

그런 다음 모든 내용 (또는 최적화하려는 경우 Sortorder로 시작하는 모든 것을 remberm) : :

Dim index As Integer = 0
For Each p As Product In products
    p.SortOrder = index
    index += 1
Next

모든 재 배열을 한 블록으로 수행하면 하나의 블록으로 업데이트를 수행하면 중복 작업이 절약됩니다.

레코드 세트가 큰 경우이 접근 방식은 잘 작동하지 않습니다. 이 경우 데이터베이스를 사용하여 작업을 수행하는 등보다 효율적인 접근 방식을 해결해야합니다.

DECLARE @sortOrder INT
DECLARE @maxSortOrder INT
SET @sortOrder = 5
SET @maxSortOrder = 10
UPDATE Products SET SortOrder = SortOrder + 1 
WHERE SortOrder >= @sortOrder AND SortOrder < @maxSortOrder

다른 팁

이것은 다중 사용자 시스템입니까? 그렇다면 그것을 고려해야합니다. 한 가지 방법은 값을 증가시키는 동안 데이터베이스를 잠그는 것입니다. 그렇지 않으면 두 사용자가 동시에 코드를 실행하면 손상된 데이터가 발생할 위험이 있습니다.

항목의 SortOrder를 편집 할 때는 원본 및 새 값이 모두 필요합니다.

목록에 5 개의 항목이있는 경우 :

  1. 항목 a
  2. 항목 b
  3. 항목 c
  4. 항목 d
  5. 항목 e

항목 D를 위치 2로 이동하려면 항목 B와 C의 SortOrder 값 만 증가하면됩니다.

또는 항목 B를 위치 4로 이동하는 경우 항목 C 및 D의 SortOrder 값을 줄여야합니다.

나는 당신의 이름을 바꿀 것입니다 UpdateProductSortOrder 방법 InsertProductSortOrder 그런 다음 새로운 방법을 작성하십시오 UpdateProductSortOrder, 이것은 2 개의 인수를 취합니다.

Public Sub UpdateProductSortOrder(ByVal originalIdx As Integer, ByVal newIdx As Integer)

이와 같은 문제를 해결할 때는 종이에 모든 시나리오를 작성하고 화살표를 그려 목록의 변경 사항이 필요한지 확인하는 데 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top