0

我怎样才能在每列上使用 3 路排序的超网格?我是说 :

一种。Ascendiing - 默认情况下指示升序 SortIndicator。

湾。降序 - 默认情况下指示降序 SortIndicator。

C。无排序 - 取消排序列。

注意:我已经尝试过 BeforeSortChanged 事件,但我遇到了 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;
                    }
                }
            }
        }
    }

我的猜测是,您需要保留一个单独的数组,其中包含行索引,并根据数组在删除排序后重新排序带内的行。但在我看来,这可能会消耗内存。

另一种方法是有一个额外的隐藏列,它可以用简单的 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 回答