簡體   English   中英

DataGridView自定義在WinForm中排序

[英]DataGridView Custom Sort in WinForm

我的DataGridView控件當前使用綁定數據的Sort屬性進行排序,但它沒有按照我想要的方式進行。

我有一個名為Employee的列,顯示為“Firstname Lastname”。

當我按Employee排序時,Amy Z_Lastname列在John A_Lastname之前,這意味着我更願意按姓氏排序。

可以將Employee字符串分成3部分,包括DataTable中的部分,並將排序設置為“Lastname,Firstname”,然后隱藏Lastname和Firstname列。

寧願學習如何覆蓋默認的IComparer(或其使用的任何東西)來提供如何按我想要的方式排序的指示(我更喜歡的答案)。

DataGridView中的自定義排序

當然,DataGridView對此排名一無所知。 通過列標題鼠標單擊調用DataGridView.Sort()的默認排序方案(數據綁定列的自動排序)只是委托給綁定到網格的列表中的ApplySort()的IBindingList實現。 通常,此列表將是DataView。 使用我的ObjectListView實現,這將是一個任意業務對象列表的視圖。 無論哪種方式,您最終都會使用屬性類型的IComparable實現來比較列表中項目的屬性。

細節

PropertyComparers屬性公開PropertyComparersCollection,它是屬性名稱鍵和IComparer值的字典。 您可以使用PropertyComparersCollection.Add()方法或索引器(例如view.PropertyComparers [“PropName”] = myComparer)替換屬性的IComparer。 要恢復默認的IComparable排序,請使用PropertyComparersCollection.Remove()方法或通過索引器將IComparer值設置為null。

如果將IComparer添加到PropertyComparers集合中,它將用於所有后續排序,直到從集合中刪除它或將其替換為另一個IComparer。 如果在PropertyComparers中添加或刪除IComparer時已對ObjectListView進行了排序,則視圖將自動重新排序。

如果要在視圖排序后更改多個屬性比較器,則可以使用ObjectListView BeginUpdate()和EndUpdate()方法來抑制ListChanged和Sort事件,直到所有IComparers都已更改為止。 這可以防止DataGridView的多次刷新。 如果在添加或刪除IComparers時未對ObjectListView進行排序,則不會進行自動重新排序。

請注意,在多列上進行排序時,自定義IComparer可以與一個排序屬性一起使用,而默認的IComparable排序可以在另一個上使用。

例如:

private void radioButtonSortProgram_CheckedChanged(object sender, EventArgs e)

{

    if (this.radioButtonSortProgramAlpha.Checked)

        this.view.PropertyComparers["Program"] = new CustomerProgramComparerAlpha();

    else if (this.radioButtonSortProgramRank.Checked)

        this.view.PropertyComparers["Program"] = new CustomerProgramComparerRank();

    else

        this.view.PropertyComparers.Remove("Program");

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM