أفضل الممارسات ترقيم البنود في القائمة ؟ SQL أو C#/VB.صافي
-
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 العناصر في القائمة الخاصة بك:
- البند
- البند ب
- البند ج
- البند D
- البند هـ
و تريد نقل العنصر د يصل إلى موقف 2 ثم سوف تحتاج فقط إلى زيادة قيمة اختيارية للعناصر B و C.
أو إذا كنت تتحرك البند ب وصولا الى موقف 4, ثم سوف تحتاج إلى إنقاص قيمة اختيارية عن العناصر C و D.
وأود أن إعادة تسمية UpdateProductSortOrder
طريقة InsertProductSortOrder
ومن ثم كتابة طريقة جديدة UpdateProductSortOrder
, الذي يأخذ 2 الحجج.
Public Sub UpdateProductSortOrder(ByVal originalIdx As Integer, ByVal newIdx As Integer)
عندما كنت أعمل على مشاكل من هذا القبيل ، فإنه يساعد لي أن أكتب كل السيناريوهات على ورقة رسم الأسهم لمعرفة ما هي التغييرات في القائمة سيكون ضروريا.