2012-12-03 67 views
0

我如何在每一列都有三维分选的超网格?我的意思是:超网格三维分选

a。 Ascendiing - 默认升序排序指示符。

b。降序 - 由默认降序SortIndicator表示。

c。没有排序 - 取消排列列。

注:我已经试过BeforeSortChanged事件,但我有2个问题:

  1. 我不能让以前的列排序指标,找出当 应该停用分拣。

  2. 我有在那里说,我们不能改变 SortIndicator在BeforeSortChange事件

回答

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; 
     } 
    } 
} 
+0

你可以发布那部分代码吗?我很好奇你是怎么编码的:) – Nyuno

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循环递增的整数来填充。一旦列的排序被“删除”,您只需将升序排序应用于该隐藏列。尽管如此,还有其他方面需要维护。

+0

感谢Nyuno,但是我发现没有任何环路我的解决方案。 –