2011-10-05 50 views
4

我正在使用ObjectListView來顯示項目列表。但是,當我點擊列標題時,列沒有被排序。如何在ObjectListView中對項目進行排序?

請參考下面的代碼粘貼:

public class Stock 
{ 
    public Stock() 
    { 
    } 

    public Stock(string name, double lastPrice, double greenTrend, double redTrend, double lastGreenValue, double lastRedValue) 
    { 
     this.Name = name; 
     this.LastPrice = lastPrice; 
     this.GreenTrend = greenTrend; 
     this.RedTrend = redTrend; 
     this.LastGreenValue = lastGreenValue; 
     this.LastRedValue = lastRedValue; 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    private string name; 

    public double LastPrice 
    { 
     get { return lastPrice; } 
     set { lastPrice = value; } 
    } 
    private double lastPrice; 

    public double GreenTrend 
    { 
     get { return greenTrend; } 
     set { greenTrend = value; } 
    } 
    private double greenTrend; 

    public double RedTrend 
    { 
     get { return redTrend; } 
     set { redTrend = value; } 
    } 
    private double redTrend; 

    public double LastGreenValue 
    { 
     get { return lastGreenValue; } 
     set { lastGreenValue = value; } 
    } 
    private double lastGreenValue; 

    public double LastRedValue 
    { 
     get { return lastRedValue; } 
     set { lastRedValue = value; } 
    } 
    private double lastRedValue; 
} 

回答

7

終於找到了答案。當我將ObjectListViewShowGroups屬性更改爲false時,排序工作。這默認設置爲true!

+3

不可能想出解決辦法要麼, 謝謝! – Jeff

+1

謝謝!爲什麼這不是我不知道的默認選項! –

4

我在ObjectListView(版本2.6.0)中做了一些代碼更改,以允許通過不可分組的列進行排序,即使ShowGoups設置爲True

這樣,它可能有與Groupable屬性設置爲False列的正常排序,並仍然能夠組項目由具有Groupable屬性設置爲True列排序時。

進行以下更改以獲取此行爲。

  1. PostProcessRows()方法,交換這個代碼(圍繞線7729):

    if (this.ShowGroups) { 
        foreach (ListViewGroup group in this.Groups) { 
         foreach (OLVListItem olvi in group.Items) { 
          ... 
    

    通過這樣的:

    if (this.ShowGroups && ((this.LastSortColumn != null) && this.LastSortColumn.Groupable)) { 
        foreach (ListViewGroup group in this.Groups) { 
         foreach (OLVListItem olvi in group.Items) { 
          ... 
    
  2. DoSort()方法,交換這個代碼(周圍7391 ):

    if (!args.Handled) { 
        // Sanity checks 
        if (args.ColumnToSort != null && args.SortOrder != SortOrder.None) { 
         if (this.ShowGroups) 
          this.BuildGroups(args.ColumnToGroupBy, args.GroupByOrder, args.ColumnToSort, args.SortOrder, 
           args.SecondaryColumnToSort, args.SecondarySortOrder); 
         else if (this.CustomSorter != null) 
          this.CustomSorter(args.ColumnToSort, args.SortOrder); 
         else 
          this.ListViewItemSorter = new ColumnComparer(args.ColumnToSort, args.SortOrder, 
           args.SecondaryColumnToSort, args.SecondarySortOrder); 
        } 
    } 
    

    本:

    if (!args.Handled) { 
        // Sanity checks 
        if (args.ColumnToSort != null && args.SortOrder != SortOrder.None) { 
         if (this.ShowGroups && args.ColumnToGroupBy.Groupable) 
          this.BuildGroups(args.ColumnToGroupBy, args.GroupByOrder, args.ColumnToSort, args.SortOrder, 
           args.SecondaryColumnToSort, args.SecondarySortOrder); 
         else if (this.CustomSorter != null) 
          this.CustomSorter(args.ColumnToSort, args.SortOrder); 
         else 
         { 
          this.Groups.Clear(); 
          this.ListViewItemSorter = new ColumnComparer(args.ColumnToSort, args.SortOrder, 
           args.SecondaryColumnToSort, args.SecondarySortOrder); 
         } 
        } 
    } 
    

現在就可以定期和可分組列都在同一個ObjectListView合併排序。

0

只需添加到Igespee的答案,如果您在沒有組的列上使用搜索並且崩潰,則還必須更改以下兩行。請記住,像這樣的更多更改可能是必要的(如之前的GetLastItemInDisplayOrder函數),但這些至少會防止每次按下按鍵時崩潰。

@@ -3948,7 +3948,7 @@命名空間BrightIdeasSoftware

/// <param name="n"></param> 
    /// <returns></returns> 
    public virtual OLVListItem GetNthItemInDisplayOrder(int n) { 
--  if (!this.ShowGroups) 
++  if (!this.ShowGroups || this.Groups.Count==0) 
      return this.GetItem(n); 

     foreach (ListViewGroup group in this.Groups) { 

@@ -3969,7 +3969,7 @@命名空間BrightIdeasSoftware

/// <param name="itemIndex"></param> 
    /// <returns></returns> 
    public virtual int GetDisplayOrderOfItemIndex(int itemIndex) { 
--  if (!this.ShowGroups) 
++  if (!this.ShowGroups || this.Groups.Count == 0) 
      return itemIndex; 
相關問題