في الماضي، لم تكن الجداول تُستخدم دائمًا لربط DataGridView مباشرةً، ولم تكن هناك مشكلة في عدم القدرة على الفرز. عندما حاولت القائمة لأول مرة، وجدت أنه لا يمكن تنفيذ وظيفة الفرز مهما قال أحد الأصدقاء
يحتوي كل عمود في DataGridView على Sortable. الإعداد الافتراضي هو Automatic. لقد قمت بتغييره إلى NotSortable. بغض النظر عن النتيجة، فإنه لا يزال لا يعمل.
قال بعض الأصدقاء أنه يمكنك سحب عنصر تحكم Bindingsource.datasource=generic datagridview.datasource=bindingsource؛
لقد وجدت أنه لا يعمل أيضًا، فماذا علي أن أفعل؟ اكتشف ذلك بعد التحقق من المعلومات
سيؤدي استخدام الأدوية العامة إلى فقدان خصائص DateTable، ويجب عليك تنفيذ System.Collections.Generic.IComparer<T> لتحقيق الفرز.
ولا توجد طريقة أخرى سوى إدراك ذلك
ألق نظرة على الكود أدناه، فهو يبدو في الأساس هكذا
شفرة
باستخدام النظام؛
باستخدام System.ComponentModel؛
باستخدام System.Collections.Generic؛
باستخدام System.Reflection؛
وظيفة قاعدة مساحة الاسم
{
فئة ObjectPropertyCompare<T>: System.Collections.Generic.IComparer<T>
{
خاصية واصف الملكية الخاصة؛
اتجاه ListSortDirection الخاص؛
ObjectPropertyCompare العامة (خاصية PropertyDescriptor، اتجاه ListSortDirection)
{
this.property = property;
this.direction = Direction;
}
#منطقة IComparer<T>
/// <الملخص>
/// طريقة المقارنة
/// </الملخص>
/// <param name="x">السمة النسبية x</param>
/// <param name="y">السمة النسبية y</param>
/// <returns></returns>
مقارنة int العامة (T x، T y)
{
الكائن xValue = x.GetType().GetProperty(property.Name).GetValue(x, null);
الكائن yValue = y.GetType().GetProperty(property.Name).GetValue(y, null);
قيمة الإرجاع int;
إذا (xValue هي IComparable)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
وإلا إذا (xValue.Equals(yValue))
{
قيمة الإرجاع = 0;
}
آخر
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
إذا (الاتجاه == ListSortDirection.Ascending)
{
إرجاع قيمة الإرجاع؛
}
آخر
{
قيمة إرجاع الإرجاع * -1؛
}
}
المنطق العام يساوي (T xWord، T yWord)
{
إرجاع xWord.Equals(yWord);
}
int العام GetHashCode(T obj)
{
إرجاع obj.GetHashCode();
}
#endregion
}
}
بعد تنفيذ هذه الواجهة، ليس هناك حاجة إلى كتابة فئة SortableBindingList <T> :BindingList <T> لربط البيانات.
التنفيذ الأساسي
شفرة
باستخدام النظام؛
باستخدام System.ComponentModel؛
باستخدام System.Collections.Generic؛
باستخدام System.IO؛
باستخدام System.Runtime.Serialization.Formatters.Binary؛
باستخدام System.Text؛
وظيفة قاعدة مساحة الاسم
{
الفئة العامة BindingCollection<T>: BindingList<T>
{
تم فرز المنطق المنطقي الخاص؛
خاصية وصف الملكية الخاصةsortProperty;
ListSortDirection الخاصsortDirection;
منطقي التجاوز المحمي IsSortedCore
{
الحصول على { تم فرز الإرجاع }
}
منطقي التجاوز المحمي يدعمSortingCore
{
الحصول على {العودة الحقيقية}
}
تجاوز محمي ListSortDirection SortDirectionCore
{
الحصول على {إرجاع نوع الاتجاه}
}
تجاوز محمي PropertyDescriptor SortPropertyCore
{
الحصول على {إرجاع خاصية الفرز}
}
يدعم منطقي التجاوز المحميSearchingCore
{
الحصول على {العودة الحقيقية}
}
تجاوز محمي باطل ApplySortCore (خاصية PropertyDescriptor، اتجاه ListSortDirection)
{
قائمة <T> العناصر = this.Items كقائمة <T>؛
إذا (العناصر!= فارغة)
{
ObjectPropertyCompare<T> pc = new ObjectPropertyCompare<T>(property, Direction);
items.Sort(pc);
isSorted = true;
}
آخر
{
isSorted = false;
}
this.sortProperty = property;
this.sortDirection = Direction;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
تجاوز محمي باطلة RemoveSortCore()
{
isSorted = false;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
//نوع
فرز الفراغ العام (خاصية PropertyDescriptor، اتجاه ListSortDirection)
{
this.ApplySortCore(property, Direction);
}
}
}
والآن حان الوقت لمعرفة كيفية استخدامه، وهو في الواقع بسيط جدًا.
مباشر
BindingCollection<object> objList = new BindingCollection<object>();
objList = مجموعة النتائج الخاصة بك؛
this.dataGridView1.DataSource = objList;
لكن المشكلة الآن هي أنني استخدمت القائمة من قبل ولا أريد تغييرها، علاوة على ذلك، تم استدعاء ملف Dll وما تم إرجاعه هو قائمة، وليس لدي طريقة لتغييرها إلى BindingCollection<object>.
بعد التفكير في الأمر لفترة طويلة، اكتشفته أخيرًا، لكنني لا أعرف كيف هو من حيث الأداء والجوانب الأخرى، لذلك سأقوم بنشر الكود ودعنا نناقشه.
هذه هي الطريقة التي حققت ذلك
شفرة
// الفئات التي يمكنها تنفيذ الفرز
BindingCollection<historyorderInfo> objList = new BindingCollection<historyorderInfo>();
// تحميل البيانات
foreach (عنصر HistoryorderInfo في tmpList)
{
objList.Add(item);
}
dgvhistory.DataSource = objList;
قائمة tmpList هنا هي القائمة الأصلية للنظام الذي استخدمته من قبل لاستيراد البيانات الأصلية إلى BindingCollection.
هذا التصميم يمكن أن يحقق التأثير الذي أريده. لا أعرف ما هو الخطأ في هذا. آمل أن أتمكن من الحصول على بعض النصائح من أحد الخبراء، هههه