2009-08-13 1 views
3

Infragistics 2009 1 권을 사용하고 있습니다.UltraGrid의 GroupBy 새로 고침 ListChanged 일 때 하위 밴드 정렬?

My UltraGrid는 비즈니스 개체 "B"의 BindingList 속성을 가진 비즈니스 개체 "B"의 BindingList에 바인딩됩니다. 그것은 두 개의 밴드를 가지게됩니다 : 하나는 "BindingList`1", 다른 하나는 "ListOfB"입니다. 통화 관리자 덕분입니다.

하위 Business Object W INotifyPropertyChange를 통해 하위 대역에서 변경이 수행 될 때마다 격자의 GroupBy 정렬을 새로 고치려합니다.

void Grid_ListChanged(object sender, ListChangedEventArgs e) 
{ 
    if (e.ListChangedType == ListChangedType.ItemChanged) 
    { 
     string columnKey = e.PropertyDescriptor.Name; 
     if (e.PropertyDescriptor.PropertyType.Name == "BindingList`1") 
     { 
      ultraGrid.DisplayLayout.Bands[columnKey].SortedColumns.RefreshSort(true); 
     } 
     else 
     { 
      UltraGridBand band = ultraGrid.DisplayLayout.Bands[0]; 
      UltraGridColumn gc = band.Columns[columnKey]; 

      if (gc.IsGroupByColumn || gc.SortIndicator != SortIndicator.None) 
      { 
       band.SortedColumns.RefreshSort(true); 
      } 
      ColumnFilter cf = band.ColumnFilters[columnKey]; 
      if (cf.FilterConditions.Count > 0) 
      { 
       ultraGrid.DisplayLayout.RefreshFilters(); 
      } 
     } 
    } 
} 

밴드 :

부울는 아이 밴드의 속성에 의해 I 그룹 (의는 "활성"라고하자) 내가 이벤트에 가입 한 경우이 이벤트 핸들러와는 바인딩 데이터 소스에의 ListChanged (참) .SortedColumns.RefreshSort가 호출되지만 활성이 건물은 아이 대역에서 변경 될 때 그것은 GROUPBY 지역에서 예측할 수없는 결과를 제공합니다 :

    : 세 가지 활성 성분 중 하나의 객체가 비활성화

    경우가에서 간다

  • 활성 : 트루 (3 개 항목)

사람 :

  • 활동 : 거짓 (3 개 항목)

대신에 내가 열을 다시 끌 때의 경우이다 (와 지역별 그룹으로)

  • 활성 : 거짓 (1 항목)

  • 활동 : 트루 (2 개 항목)

내가 뭔가 잘못하고 있습니까?

RefreshSort (true)를 수행 할 때 행의 확장 된 상태를 복원하는 방법이 있습니까? ?

답변

0

나에게 버그가있어. Infragistics로 파일을 보내야합니다.

해결 방법 - 이것은 좋은 해결책이 아니며 테스트하지는 않았지만 항상 임시 저장소에 정렬 (그룹) 열을 저장하고 RefreshSort()를 밴드에 저장 한 다음 sort-by (gorup) 열을 적용하고 다시 정렬합니까?

즉. 그룹별로 삭제 한 다음 다시 신청하십시오.

불쾌하지만 바인딩을 벗어날 수 있습니다.

0

음이 나는 문제를

var ultraGridBand = this.ExperimentGrid.DisplayLayout.Bands[0]; 
      int nbGroup = ultraGridBand.Columns.All.Count(obj => ((UltraGridColumn) obj).IsGroupByColumn); 
      //if (ultraGridBand.Columns.All.Any(obj => ((UltraGridColumn)obj).SortIndicator != SortIndicator.None))) 
      if (nbGroup == 0)//no grouping 
       ultraGridBand.SortedColumns.RefreshSort(true); 
      else if (nbGroup > 0) 
      { 
       var expandedRows = new List<ExpandedRow>(); 
       var rowLevel1 = this.ExperimentGrid.DisplayLayout.Rows; 
       ExtractExpandedRows(expandedRows, rowLevel1); 
       ultraGridBand.SortedColumns.RefreshSort(true); 
       SetExpandedRows(expandedRows, rowLevel1); 
      } 



    private static void SetExpandedRows(IEnumerable<ExpandedRow> expandedRows, RowsCollection rowLevel) 
    { 
     foreach (object obj in rowLevel.All) 
     { 
      var row = obj as UltraGridGroupByRow; 
      if (row != null) 
      { 
       var expandedRow = expandedRows.FirstOrDefault(x => x.Value == row.ValueAsDisplayText); 
       if (expandedRow != null) 
       { 
        row.Expanded = expandedRow.IsExpanded; 
        SetExpandedRows(expandedRow.SubRows, row.Rows); 
       } 
      } 
     } 
    } 

    private static void ExtractExpandedRows(ICollection<ExpandedRow> expandedRows, RowsCollection rowLevel) 
    { 
     foreach (object obj in rowLevel.All) 
     { 
      var row = obj as UltraGridGroupByRow; 
      if(row != null) 
      { 
       var expandedRow = new ExpandedRow() { Value = row.ValueAsDisplayText, IsExpanded = row.Expanded }; 
       expandedRows.Add(expandedRow); 
       ExtractExpandedRows(expandedRow.SubRows, row.Rows); 
      } 
     } 
    } 

를 해결하기 위해 관리하는 방법입니다 그리고 이것은 정보가 들어있는 개체입니다

class ExpandedRow 
{ 
    public string Value { get; set; } 
    public bool IsExpanded { get; set; } 
    private readonly List<ExpandedRow> _subRows = new List<ExpandedRow>(); 
    public List<ExpandedRow> SubRows { get { return _subRows; } } 
} 
관련 문제