0

すべての列で 3 通りの並べ替えを行うウルトラグリッドを使用するにはどうすればよいですか? つまり :

a. 昇順 - デフォルトで昇順の SortIndicator で示されます。

b. 降順 - デフォルトで降順で示されます。SortIndicator。

c. 並べ替えなし - 列の並べ替えを解除します。

注:BeforeSortChanged Eventを試しましたが、2つの問題がありました:

  1. 以前の列の並べ替えインジケーターを取得して、いつ並べ替えを無効にする必要があるかを確認できませんでした。

  2. BeforeSortChange イベントで SortIndicator を変更できないという例外が発生しました。

4

2 に答える 2

1

「ソートされていない」状態を実装するのはそれほど簡単ではありません。データがソートされると、バンド内で単純に並べ替えられます。以下のコードを適用すると、自分で確認できます。

    Infragistics.Win.UltraWinGrid.UltraGridColumn[] oldSort;

    private void Sort() {
        ultraGrid1.BeforeSortChange += new Infragistics.Win.UltraWinGrid.BeforeSortChangeEventHandler(ultraGrid1_BeforeSortChange);
        ultraGrid1.AfterSortChange += new Infragistics.Win.UltraWinGrid.BandEventHandler(ultraGrid1_AfterSortChange);
    }

    void ultraGrid1_BeforeSortChange(object sender, Infragistics.Win.UltraWinGrid.BeforeSortChangeEventArgs e) {
        oldSort = new Infragistics.Win.UltraWinGrid.UltraGridColumn[e.Band.SortedColumns.Count];
        e.Band.SortedColumns.CopyTo(oldSort, 0);
    }

    void ultraGrid1_AfterSortChange(object sender, Infragistics.Win.UltraWinGrid.BandEventArgs e) {
        for (int i = 0; i < oldSort.Length; i++) {
            for (int j = 0; j < e.Band.SortedColumns.Count; j++) {
                Infragistics.Win.UltraWinGrid.UltraGridColumn column = e.Band.SortedColumns[j];
                if (column.Key == oldSort[i].Key) {
                    if (column.SortIndicator == Infragistics.Win.UltraWinGrid.SortIndicator.Ascending) {
                        //column.SortIndicator = Infragistics.Win.UltraWinGrid.SortIndicator.None;
                        e.Band.SortedColumns.Remove(column.Key);
                        j--;
                        break;
                    }
                }
            }
        }
    }

私の推測では、配列に従って、行インデックスを含む別の配列を保持し、並べ替えが削除されたらバンド内の行を並べ替える必要があると思います。しかし、それは私の意見ではメモリを消費する可能性があります。

もう 1 つの方法は、単純な for ループでインクリメントされた整数で埋められる隠し列を追加することです。列の並べ替えが「削除」されたら、非表示の列に昇順並べ替えを適用するだけです。ただし、このような方法で維持する必要がある他の側面があります。

于 2012-12-12T23:02:06.923 に答える
1

UIElement.GetContext() を使用して、グリッドの Mouse Up イベント ハンドラーでクリックされた列を見つけて問題を解決し、その列の sortIndicator プロパティを確認して必要なものに変更しました。

編集 :

private void Grid_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        UIElement element = Grid.DisplayLayout.UIElement.ElementFromPoint(new Point(e.X, e.Y));
        if (element == null)
            return;

        ColumnHeader clickedHeader = (ColumnHeader)element.GetContext(typeof(ColumnHeader), true);

        UltraGridColumn clickedColumn;

        if (clickedHeader != null)
            clickedColumn = clickedHeader.Column;

        if (clickedColumn == null)
            return;

        Switch ( clickedColumn.SortIndicator)
        {
           case SortIndicator.Ascending :
               clickedColumn.SortIndicator= SortIndicator.Descending;
               break;
           case SortIndicator.Descending :
               clickedColumn.SortIndicator= SortIndicator.Disabled;
               break;
           case SortIndicator.Disabled :
           default :
               clickedColumn.SortIndicator= SortIndicator.Ascending;
               break;
        }
    }
}
于 2012-12-24T06:27:50.413 に答える