أفضل الممارسات ترقيم البنود في القائمة ؟ SQL أو C#/VB.صافي

StackOverflow https://stackoverflow.com/questions/1070328

  •  21-08-2019
  •  | 
  •  

سؤال

لدي جدول قاعدة البيانات التي لديها اختيارية صحيح العمود.في واجهة المستخدم على إضافة وتحرير الجدول البنود, لدي قائمة منسدلة من صحيح للسماح للمستخدم تحديد المكان في اختيارية أنها ترغب في هذا البند على ما يبدو.سؤالي هو قول القائمة ، {1,2,3,4,5,"آخر"}, إذا كان المستخدم يختار عددا ، أريد أن يكون البنود اختيارية السمة ، ثم البند مع أن 'اختيارية' حاليا سيكون صدم واحد (+=1) وكذلك العناصر مع أعلى 'اختيارية' بينما لا تؤثر على العناصر مع انخفاض 'اختيارية'.أنا حاليا لديها وحدة عامة 'المرافق' باستخدام VB.NET و Linq

خاصة _db جديدة MyDataContext

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

ولكن يمكنني الحصول على بعض أخطاء عرضية عند تحرير متناسق العناصر مثل هذا

Protected Sub ProductsGridSource_Updating(ByVal sender As Object, ByVal e As System.ويب.واجهة المستخدم.WebControls.LinqDataSourceUpdateEventArgs) خافت اختيارية As Integer = DirectCast(هـ.NewObject المنتج).اختيارية المرافق العامة.UpdateProductSortOrder(اختيارية) End Sub

هل هناك أكثر محصنين ربما أفضل الممارسات الطريقة يجب أن تفعل هذا ؟ أي نصيحة هي محل تقدير.

شكرا مقدما ، ~ck في سان دييغو

هل كانت مفيدة؟

المحلول

والحيلة من أجل التحرير هو أنك لا تريد تحديث كل عدد، إلا أن أعداد المتضررين من التغيير. لعنصر واحد يمكن أن يكون سهلا، ولكن إذا كنت تقوم بتحرير سلع متعددة في وقت واحد وأود أن تخزين العناصر في قائمة مرتبة حسب الترتيب:

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); 

وثم ترقيم كل شيء (أو كل شيء بدءا من الترتيب إذا كنت ترغب في تحسين):

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

نصائح أخرى

هل هذا نظام متعدد المستخدمين؟ إذا كان الأمر كذلك فعليك أن تأخذ ذلك في الاعتبار. طريقة واحدة لتأمين قاعدة البيانات بينما كنت تزايد القيم. خلاف ذلك، هل خطر الحصول على البيانات الفاسدة إذا اثنين من المستخدمين تشغيل التعليمات البرمجية في نفس الوقت.

عند تحرير عنصر اختيارية, سوف تحتاج على حد سواء الأصلي و قيم جديدة.

إذا كان لديك 5 العناصر في القائمة الخاصة بك:

  1. البند
  2. البند ب
  3. البند ج
  4. البند D
  5. البند هـ

و تريد نقل العنصر د يصل إلى موقف 2 ثم سوف تحتاج فقط إلى زيادة قيمة اختيارية للعناصر B و C.

أو إذا كنت تتحرك البند ب وصولا الى موقف 4, ثم سوف تحتاج إلى إنقاص قيمة اختيارية عن العناصر C و D.

وأود أن إعادة تسمية UpdateProductSortOrder طريقة InsertProductSortOrder ومن ثم كتابة طريقة جديدة UpdateProductSortOrder, الذي يأخذ 2 الحجج.

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

عندما كنت أعمل على مشاكل من هذا القبيل ، فإنه يساعد لي أن أكتب كل السيناريوهات على ورقة رسم الأسهم لمعرفة ما هي التغييرات في القائمة سيكون ضروريا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top