C# 刷新超级网格';当列表更改时,是否在子栏上按GroupBy排序?

C# 刷新超级网格';当列表更改时,是否在子栏上按GroupBy排序?,c#,.net,data-binding,infragistics,ultrawingrid,C#,.net,Data Binding,Infragistics,Ultrawingrid,我正在使用基础设施2009第1卷 My UltraGrid绑定到业务对象“a”的绑定列表,其自身具有业务对象“B”的绑定列表属性。由于货币管理器的作用,它产生了两个波段:一个名为“BindingList`1”,另一个名为“ListOfB” 每当通过子业务对象和INotifyPropertyChange对子带执行更改时,我希望刷新GroupBy排序的网格 如果我按照子带中的一个属性进行分组,该属性是一个布尔值(假设为“活动”),并且我使用此事件处理程序订阅bindinglist数据源上的事件Lis

我正在使用基础设施2009第1卷

My UltraGrid绑定到业务对象“a”的绑定列表,其自身具有业务对象“B”的绑定列表属性。由于货币管理器的作用,它产生了两个波段:一个名为“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),但当子band中的Active属性发生更改时,它会在groupby区域中产生不可预测的结果:

如果三个活动对象中有一个变为非活动对象,它将从:

  • 活动:真(3项)
致:

  • 活动:假(3项)
而不是(当我将列来回拖动到“按区域分组”时就是这种情况)

  • 活动:False(1项)

  • 活动:真(2项)

我做错什么了吗


在执行RefreshSort(true)时,是否有方法恢复行的展开状态

听起来像个bug-你应该向基础设施部提交一个

至于解决方法-这不是一个很好的解决方案,我还没有测试过它,但您可以尝试将排序依据(组)列保存到临时存储中,在带区上刷新排序(),然后重新应用排序依据(gorup)列,然后再次排序

即:删除分组,然后重新应用


很糟糕,但这可能会让你摆脱困境。

好吧,这就是我解决问题的方法

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);
            }
        }
    }
var ultraGridBand=this.ExperimentGrid.DisplayLayout.Bands[0];
int nbGroup=ultraGridBand.Columns.All.Count(obj=>((UltraGridBolumn)obj.IsGroupByColumn);
//if(ultraGridBand.Columns.All.Any(obj=>((UltraGridBolumn)obj.SortIndicator!=SortIndicator.None)))
if(nbGroup==0)//无分组
ultraGridBand.SortedColumns.RefreshSort(true);
如果(nbGroup>0),则为else
{
var expandedRows=新列表();
var rowLevel1=this.ExperimentGrid.DisplayLayout.Rows;
ExtractExpandedRows(expandedRows,第1行);
ultraGridBand.SortedColumns.RefreshSort(true);
SetExpandedRows(expandedRows,行级别1);
}
私有静态void SetExpandedRows(IEnumerable expandedRows,RowsCollection rowLevel)
{
foreach(rowLevel.All中的对象对象)
{
var row=obj作为UltraGridGroupByRow;
如果(行!=null)
{
var expandedRow=expandedRows.FirstOrDefault(x=>x.Value==row.ValueAsDisplayText);
if(expandedRow!=null)
{
row.Expanded=expandedRow.IsExpanded;
SetExpandedRows(expandedRow.SubRows,row.Rows);
}
}
}
}
专用静态空心提取expandedRows(ICollection expandedRows,RowsCollection rowLevel)
{
foreach(rowLevel.All中的对象对象)
{
var row=obj作为UltraGridGroupByRow;
如果(行!=null)
{
var expandedRow=new expandedRow(){Value=row.ValueAsDisplayText,IsExpanded=row.Expanded};
expandedRow.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; } }
}
class ExpandedRow
{
公共字符串值{get;set;}
公共布尔展开{get;set;}
私有只读列表_subRows=new List();
公共列表子对象{get{return}
}