4

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;
}
4

3 回答 3

10

终于找到了答案。当我将 的ShowGroups属性更改ObjectListView为 false 时,排序工作。默认情况下设置为true!

于 2011-10-06T05:17:14.700 回答
4

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

这样,可以对属性设置为的列进行正常排序,Groupable并且在按属性设置为 TrueFalse的列排序时仍然能够对项目进行分组。Groupable

进行以下更改以获得此行为。

  1. 在该PostProcessRows()方法中,交换此代码(围绕 line 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

于 2013-04-19T13:58:46.007 回答
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;
于 2014-02-21T11:46:21.830 回答