Menu

DataTreeListView with CustomSorter

alon
2016-07-14
2016-07-15
  • alon

    alon - 2016-07-14

    When I set the CustomSorter of a DataTreeListView the sort is not working.
    The same CustomSorte for a DataListView on the same data works fine.

    I think CustomSorter is used internally by DataTreeListView - see VirtualObjectListView (?)

    With regards,
    Alon

     
  • alon

    alon - 2016-07-14

    From the Cookbook:

    If you are using a VirtualObjectListView (or one of its subclasses FastObjectListView or TreeListView), you cannot use the CustomSorter. You have to implement the SortObjects() method of the IVirtualListDataSource.

    1. Could not find IVirtualListDataSource.SortObjects ?
    2. When implementing my IVirtualListDataSource should I derive it from TreeListView.Tree?
    3. And how do I inject my IVirtualListDataSource into my DataTreeListView

    sounds too complicated... :(

     
  • alon

    alon - 2016-07-15

    The solution I found:

        public sealed class MyDataTreeListView : DataTreeListView
        {
            public MyDataTreeListView()
            {
                TreeFactory = treeView => new MyTree(treeView);
                RegenerateTree();
            }
    
            private class MyTree : Tree
            {
                private OLVColumn _lastSortColumn;
                private SortOrder _lastSortOrder;
    
                public MyTree(TreeListView treeView)
                    : base(treeView)
                {
                }
    
                public override void Sort(OLVColumn column, SortOrder order)
                {
                    _lastSortColumn = column;
                    _lastSortOrder = order;
    
                    base.Sort(column, order);
                }
    
                protected override BranchComparer GetBranchComparer()
                {
                    if (_lastSortColumn == null)
                        return null;
    
                    return new BranchComparer(new MyModelObjectComparer(
                        _lastSortColumn,
                        _lastSortOrder,
                        TreeView.SecondarySortColumn ?? TreeView.GetColumn(0),
                        TreeView.SecondarySortColumn == null ? _lastSortOrder : TreeView.SecondarySortOrder));
                }
            }
    
            private class MyModelObjectComparer : IComparer, IComparer<object>
            {
                private readonly OLVColumn _column;
                private readonly SortOrder _sortOrder;
                private readonly ModelObjectComparer _olvMyModelObjectComparer;
                readonly EventViewerOLV.SensorColumnComparer _sensorColumnComparer;
    
                private MyModelObjectComparer(OLVColumn col, SortOrder order)
                {
                    _column = col;
                    _sortOrder = order;
                    _olvMyModelObjectComparer = new ModelObjectComparer(col, order);
    
                    _sensorColumnComparer = new EventViewerOLV.SensorColumnComparer(_sortOrder);
                }
    
                public MyModelObjectComparer(OLVColumn col, SortOrder order, OLVColumn col2, SortOrder order2)
                    : this(col, order)
                {
                }
    
                public int Compare(object x, object y)
                {
                    if (string.Equals(_column.AspectName, EventViewerManager.ColName.Name))
                    {
                        // this is my custom sort...
                        var dataRowX = EventViewerOLV.RowObjectToDataRow(x);
                        var dataRowY = EventViewerOLV.RowObjectToDataRow(y);
    
                        return _sensorColumnComparer.CompareDataRows(dataRowX, dataRowY);
                    }
    
                    return _olvMyModelObjectComparer.Compare(x, y);
                }
            }
        }
    

    Thank you for a great control

     

Log in to post a comment.