我怎样才能在每列上使用 3 路排序的超网格?我是说 :
一种。Ascendiing - 默认情况下指示升序 SortIndicator。
湾。降序 - 默认情况下指示降序 SortIndicator。
C。无排序 - 取消排序列。
注意:我已经尝试过 BeforeSortChanged 事件,但我遇到了 2 个问题:
我无法获取上一列排序指示器来找出我应该何时禁用排序。
我有一个异常,它说我们不能在 BeforeSortChange 事件中更改 SortIndicator
我怎样才能在每列上使用 3 路排序的超网格?我是说 :
一种。Ascendiing - 默认情况下指示升序 SortIndicator。
湾。降序 - 默认情况下指示降序 SortIndicator。
C。无排序 - 取消排序列。
注意:我已经尝试过 BeforeSortChanged 事件,但我遇到了 2 个问题:
我无法获取上一列排序指示器来找出我应该何时禁用排序。
我有一个异常,它说我们不能在 BeforeSortChange 事件中更改 SortIndicator
实现“未排序”状态并不是那么简单。数据排序后,只需在波段内重新排序即可。您可以通过应用以下代码自己查看:
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 循环中递增的整数填充。一旦列的排序被“删除”,您只需将升序排序应用于该隐藏列。但是,还有其他方面需要使用这种方法进行维护。
我通过使用 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;
}
}
}