如何在ObjectListView中对项目进行排序?

时间:2011-10-05 12:15:56

标签: c# sorting 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;
}

3 个答案:

答案 0 :(得分:10)

终于找到了答案。当我将ShowGroups的{​​{1}}属性更改为false时,排序有效。默认设置为true!

答案 1 :(得分:4)

我在ObjectListView(版本2.6.0)中进行了一些代码更改,以便即使ShowGoups设置为True,也可以按不可分组列进行排序。

通过这种方式,可以对Groupable属性设置为False的列进行常规排序,并且仍然可以在按Groupable的列排序时对项进行分组property设置为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);
            }
        }
    }
    
  3. 现在可以在一个ObjectListView组合中对常规列和可分组列进行排序。

答案 2 :(得分:0)

只是添加到Igespee的答案,如果您在没有组并且崩溃的列上使用搜索,则还必须更改以下两行。请记住,这样的更多更改可能是必要的(如之前的GetLastItemInDisplayOrder函数),但这些至少可以防止每次按下键时崩溃。

@@-3948,7 +3948,7 @@ namespace 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 @@ namespace 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;