我如何在每一列都有三维分选的超网格?我的意思是:超网格三维分选
a。 Ascendiing - 默认升序排序指示符。
b。降序 - 由默认降序SortIndicator表示。
c。没有排序 - 取消排列列。
注:我已经试过BeforeSortChanged事件,但我有2个问题:
我不能让以前的列排序指标,找出当 应该停用分拣。
我有在那里说,我们不能改变 SortIndicator在BeforeSortChange事件
我如何在每一列都有三维分选的超网格?我的意思是:超网格三维分选
a。 Ascendiing - 默认升序排序指示符。
b。降序 - 由默认降序SortIndicator表示。
c。没有排序 - 取消排列列。
注:我已经试过BeforeSortChanged事件,但我有2个问题:
我不能让以前的列排序指标,找出当 应该停用分拣。
我有在那里说,我们不能改变 SortIndicator在BeforeSortChange事件
我解决了我的问题,通过使用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;
}
}
}
这不是微不足道的实施了“无序”状态的异常。一旦数据被排序后,它就会在乐队中重新排序。您可以通过将下面的代码看到自己:
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循环递增的整数来填充。一旦列的排序被“删除”,您只需将升序排序应用于该隐藏列。尽管如此,还有其他方面需要维护。
感谢Nyuno,但是我发现没有任何环路我的解决方案。 –
你可以发布那部分代码吗?我很好奇你是怎么编码的:) – Nyuno