ในอดีต ตารางไม่ได้ถูกใช้เพื่อผูก DataGridView โดยตรงเสมอไป และไม่มีปัญหาในการเรียงลำดับ เมื่อฉันลองใช้ List ครั้งแรก ฉันพบว่าไม่สามารถใช้ฟังก์ชันการเรียงลำดับได้ไม่ว่าเพื่อนจะพูดอะไรก็ตาม
แต่ละคอลัมน์ของ DataGridView มีการจัดเรียง ค่าเริ่มต้นคืออัตโนมัติ ฉันเปลี่ยนเป็น NotSortable ไม่ว่าผลลัพธ์จะเป็นอย่างไรก็ยังใช้งานไม่ได้
เพื่อนบางคนบอกว่าคุณสามารถลากตัวควบคุมbindingsourceได้bindingsource.datasource=generic collection datagridview.datasource=bindingsource;
ฉันพบว่ามันไม่ได้ผลเช่นกัน ดังนั้นฉันควรทำอย่างไร? ค้นหาหลังจากตรวจสอบข้อมูลแล้ว
การใช้ข้อมูลทั่วไปจะสูญเสียคุณสมบัติของ DateTable คุณต้องใช้ System.Collections.Generic.IComparer<T> เพื่อให้เกิดการเรียงลำดับ
ไม่มีทางอื่นนอกจากต้องตระหนักรู้
ลองดูโค้ดด้านล่างนี้ โดยพื้นฐานแล้วจะเป็นแบบนี้
รหัส
ใช้ระบบ;
โดยใช้ System.ComponentModel;
ใช้ System.Collections.Generic;
โดยใช้ System.Reflection;
เนมสเปซ BaseFunction
-
คลาส ObjectPropertyCompare <T> : System.Collections.Generic.IComparer <T>
-
คุณสมบัติ PropertyDescriptor ส่วนตัว
ทิศทาง ListSortDirection ส่วนตัว;
สาธารณะ ObjectPropertyCompare (คุณสมบัติ PropertyDescriptor, ทิศทาง ListSortDirection)
-
this.property = คุณสมบัติ;
this.direction = ทิศทาง;
-
#ภูมิภาค IComparer<T>
/// <สรุป>
/// วิธีการเปรียบเทียบ
/// </สรุป>
/// <param name="x">แอตทริบิวต์สัมพัทธ์ x</param>
/// <param name="y">แอตทริบิวต์สัมพัทธ์ y</param>
/// <ส่งคืน></ส่งคืน>
สาธารณะ 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)
-
ส่งคืนค่าส่งคืน;
-
อื่น
-
กลับ returnValue * -1;
-
-
บูลสาธารณะเท่ากับ (T xWord, T yWord)
-
กลับ xWord.Equals(yWord);
-
สาธารณะ int GetHashCode (T obj)
-
กลับ obj.GetHashCode();
-
#ภูมิภาคสุดท้าย
-
-
หลังจากใช้อินเทอร์เฟซนี้แล้ว เราจะไม่รีบเร่ง เราต้องเขียนคลาส SortableBindingList <T> :BindingList <T> เพื่อผูกข้อมูล
การใช้งานขั้นพื้นฐาน
รหัส
ใช้ระบบ;
โดยใช้ System.ComponentModel;
ใช้ System.Collections.Generic;
ใช้ System.IO;
โดยใช้ System.Runtime.Serialization.Formatters.Binary;
ใช้ System.Text;
เนมสเปซ BaseFunction
-
BindingCollection<T> คลาสสาธารณะ : BindingList<T>
-
บูลส่วนตัว isSorted;
ส่วนตัว PropertyDescriptor sortProperty;
ListSortDirection ส่วนตัว sortDirection;
บูลแทนที่การป้องกัน IsSortedCore
-
รับ { ส่งคืน isSorted;
-
บูลแทนที่การป้องกัน SupportSortingCore
-
รับ { คืนค่าจริง }
-
ป้องกันแทนที่ ListSortDirection SortDirectionCore
-
รับ { กลับ sortDirection; }
-
ป้องกันแทนที่ PropertyDescriptor SortPropertyCore
-
รับ { กลับ sortProperty;
-
บูลแทนที่การป้องกัน SupportSearchingCore
-
รับ { คืนค่าจริง }
-
การป้องกันการแทนที่เป็นโมฆะ ApplySortCore (คุณสมบัติ PropertyDescriptor, ทิศทาง ListSortDirection)
-
รายการ <T> รายการ = this.Items เป็นรายการ <T>;
ถ้า (รายการ != null)
-
ObjectPropertyCompare<T> pc = ใหม่ ObjectPropertyCompare<T>(คุณสมบัติ ทิศทาง);
รายการเรียงลำดับ(พีซี);
isSorted = จริง;
-
อื่น
-
isSorted = เท็จ;
-
sortProperty = คุณสมบัติ;
sortDirection = ทิศทาง;
this.OnListChanged (ListChangedEventArgs ใหม่ (ListChangedType.Reset, -1));
-
ป้องกันแทนที่เป็นโมฆะ RemoveSortCore()
-
isSorted = เท็จ;
this.OnListChanged (ListChangedEventArgs ใหม่ (ListChangedType.Reset, -1));
-
//เรียงลำดับ
การเรียงลำดับโมฆะสาธารณะ (คุณสมบัติ PropertyDescriptor, ทิศทาง ListSortDirection)
-
this.ApplySortCore (คุณสมบัติ, ทิศทาง);
-
-
-
ถึงเวลาหาวิธีใช้งานแล้ว จริงๆ แล้วมันก็ง่ายมาก
โดยตรง
BindingCollection<วัตถุ> objList = ใหม่ BindingCollection<วัตถุ>();
objList = ชุดผลลัพธ์ของคุณ;
this.dataGridView1.DataSource = objList;
แต่ตอนนี้ปัญหาคือฉันเคยใช้ List มาก่อนและฉันไม่ต้องการเปลี่ยนมัน ยิ่งไปกว่านั้น Dll ถูกเรียกและสิ่งที่ถูกส่งคืนคือ List ฉันไม่มีทางเปลี่ยนเป็น BindingCollection<object> ได้
หลังจากคิดอยู่นาน ในที่สุดฉันก็คิดออก แต่ฉันไม่รู้ว่ามันเป็นอย่างไรในแง่ของประสิทธิภาพและด้านอื่น ๆ ดังนั้นฉันจะโพสต์โค้ดแล้วมาหารือกัน
นี่คือวิธีที่ฉันประสบความสำเร็จ
รหัส
//คลาสที่สามารถดำเนินการเรียงลำดับได้
BindingCollection<historyorderInfo> objList = ใหม่ BindingCollection<historyorderInfo>();
//โหลดข้อมูล
foreach (รายการ historyorderInfo ใน tmpList)
-
objList.Add(รายการ);
-
dgvhistory.DataSource = objList;
tmpList ที่นี่คือรายการดั้งเดิมของระบบที่ฉันใช้ก่อนหน้านี้ ฉันใช้ foreach เพื่อนำเข้าข้อมูลต้นฉบับไปยัง BindingCollection
ความมุ่งมั่นนี้สามารถบรรลุผลที่ฉันต้องการได้ ฉันไม่รู้ว่าเกิดอะไรขึ้นกับเรื่องนี้ หวังว่าคงจะได้รับคำแนะนำจากผู้เชี่ยวชาญนะครับ 555