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場合でもグループ化できない列による並べ替えを有効にしました。ShowGoupsTrue

このようにして、プロパティがに設定されている列の通常の並べ替えを行うGroupableことができ、プロパティがTrueに設定されFalseている列で並べ替えるときにアイテムをグループ化することができます。Groupable

この動作を実現するには、次の変更を行います。

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

これで、通常の列とグループ化可能な列をすべて1つにObjectListViewまとめて並べ替えることができるようになります。

于 2013-04-19T13:58:46.007 に答える
0

Igespeeの回答に追加するだけで、グループがなくクラッシュしている列で検索を使用する場合は、次の2行も変更する必要があります。このような変更がおそらく必要であることに注意してください(直前の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 に答える