2012-12-03 3 views
0

모든 컬럼에서 3 방향 정렬을 사용하여 울트라 그리드를 만들 수 있습니까? 내 말은 :울트라 그리드에서 3 방향 정렬

a. Ascendiing - 기본적으로 SortIndicator를 오름차순으로 표시합니다.

b. 내림차순 - 기본적으로 내림차순 SortIndicator로 표시됩니다.

c. 정렬 없음 - 열을 정렬 해제합니다.

참고 : 나는 BeforeSortChanged 이벤트를 시도했지만 나는이 문제를 가지고 :

  1. 내가 내가 정렬 기능을 해제 할시기를 알아 내기 위해 이전 칼럼 정렬 표시기를 얻을 수 있습니다.

  2. 나는 우리가 그것은 "분류되지 않은"상태를 구현하기 위해 그 사소한 아니다 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

에 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 루프에서 증가 된 정수로 채워질 수있는 추가 숨겨진 열을 갖는 것입니다. 열의 정렬이 "제거"되면 해당 숨겨진 열에 오름차순 정렬을 적용하기 만하면됩니다. 이러한 방법으로 유지해야 할 다른 측면이 있습니다.

+0

감사 이리노,하지만 난 어떤 루프없이 내 솔루션을 발견했다. –

관련 문제