2012-12-03 98 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,但是我發現沒有任何環路我的解決方案。 –