3

Infragistics 2009vol1を使用しています。

私のUltraGridは、ビジネスオブジェクト「B」のBindingListプロパティを持つビジネスオブジェクト「A」のBindingListにバインドされています。その結果、2つのバンドが作成されます。1つは「BindingList`1」という名前で、もう1つは通貨マネージャーのおかげで「ListOfB」という名前です。

子ビジネスオブジェクトとINotifyPropertyChangeを介して子バンドで変更が実行されるたびに、GroupByソートのグリッドを更新したいと思います。

ブール値(たとえば「アクティブ」)である子バンドのプロパティでグループ化し、このイベントハンドラーを使用してバインディングリストデータソースのイベント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つのアクティブのうちの1つのオブジェクトが非アクティブになると、次のようになります。

  • アクティブ:True(3アイテム)

に:

  • アクティブ:False(3項目)

代わりに(これは、列をgroup byareaに前後にドラッグする場合です)

  • アクティブ:False(1アイテム)

  • アクティブ:True(2アイテム)

私は何か間違ったことをしていますか?

RefreshSort(true)を実行するときに、行の展開状態を復元する方法はありますか??

4

2 に答える 2

0

私にはバグのように聞こえます-Infragisticsにバグを提出する必要があります。

回避策について-これは良い解決策ではなく、私はそれをテストしていませんが、いつでも並べ替え(グループ)列を一時ストア、バンドのRefreshSort()に保存してから、並べ替えを再適用することができます-(gorup)列で、もう一度並べ替えますか?

すなわち。group-byを削除してから、再適用します。

厄介ですが、それはあなたを束縛から解放するかもしれません。

于 2009-11-15T22:29:41.673 に答える
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; } }
}
于 2013-08-05T07:53:48.330 に答える