2009-08-13 5 views
3

J'utilise Infragistics 2009 vol 1.Actualiser GroupBy Tri UltraGrid sur les bandes enfant lors de ListChanged?

Mon UltraGrid est lié à une BindingList d'objets métier "A" ayant eux-mêmes une propriété BindingList des objets métier "B". Il en résulte deux bandes: l'une nommée "BindingList`1", l'autre "ListOfB" grâce au gestionnaire de devises.

Je souhaite actualiser le type GroupBy de la grille chaque fois qu'une modification est effectuée sur la bande enfant via l'objet métier enfant et INotifyPropertyChange.

Si le groupe I par une propriété dans la bande de l'enfant qui est un booléen (disons « Actif ») et je souscris à l'événement ListChanged sur la source de données BindingList avec ce gestionnaire d'événements:

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(); 
      } 
     } 
    } 
} 

la bande .SortedColumns.RefreshSort (true) est appelée, mais il donne des résultats imprévisibles dans la région groupby lorsque la propriété active est modifiée dans la bande des enfants:

si un objet de trois actifs devient inactif, il va de:

  • actifs: True (3 articles)

À:

  • actifs: Faux (3 articles)

au lieu de (ce qui est le cas lorsque je fais glisser la colonne arrière et selon le groupe par zone)

  • actif: False (1 objet)

  • actifs: True (2 articles)

Ai-je fait quelque chose de mal?

Existe-t-il un moyen de restaurer l'état étendu des lignes lors de l'exécution d'un RefreshSort (true); ?

Répondre

0

Cela me semble être un bug - vous devriez en déposer un avec Infragistics. Pour une solution de contournement - ce n'est pas une bonne solution et je ne l'ai pas testé mais vous pouvez toujours essayer d'enregistrer les colonnes sort-by (groupe) dans un magasin temporaire, RefreshSort() sur le groupe, puis re -appliquer les colonnes sort-by (gorup), et trier à nouveau?

ie. Supprimer le groupe par, puis réappliquer.

Nasty, mais il pourrait vous sortir d'une contrainte.

0

Eh bien, voilà comment je parviens à résoudre le problème

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); 
      } 
     } 
    } 

Et ceci est l'objet qui contient les informations

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; } } 
} 
Questions connexes