刷新UltraGrid组按列表更改时对子带进行排序?

时间:2009-08-13 10:26:43

标签: c# .net data-binding infragistics ultragrid

我正在使用Infragistics 2009第1卷。

我的UltraGrid绑定到业务对象“A”的BindingList,它们自己拥有业务对象“B”的BindingList属性。它导致有两个波段:一个名为“BindingList`1”,另一个名为“ListOfB”,这要归功于货币经理。

每当通过子业务对象和INotifyPropertyChange对子带执行更改时,我想刷新GroupBy网格类型。

如果我通过子带中的属性进行分组,这是一个布尔值(让我们说“活动”),我使用此事件处理程序订阅bindinglist数据源上的事件ListChanged:

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

调用band.SortedColumns.RefreshSort(true)但是当在子带中更改属性Active时,它会在groupby区域中产生不可预测的结果:

如果三个活动中的一个对象变为非活动状态,则来自:

  • 活跃:真(3项)

要:

  • 主动:假(3项)

而不是(按照区域来回拖动列的情况)

  • 有效:错误(1项)

  • 活跃:真(2项)

我做错了吗?

执行RefreshSort(true)时是否有办法恢复行的展开状态; ?

2 个答案:

答案 0 :(得分:0)

对我来说听起来像个错误 - 你应该用Infragistics提交一个。

至于解决方法 - 这不是一个很好的解决方案,我还没有测试过,但你总是可以尝试将sort-by(group)列保存到临时存储区,RefreshSort()上,然后重新应用sort-by(gorup)列,然后再次排序?

即。删除分组,然后重新申请。

讨厌,但它可能会让你脱离困境。

答案 1 :(得分: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; } }
}