Use ListBox to Manage GridView Columns

6 posts, 0 answers
  1. David
    David avatar
    27 posts
    Member since:
    Apr 2013

    Posted 03 Dec 2015 Link to this post

    I am using the following listbox to manage visibility and order of the columns in my grid view. It works great for visibility (of course). If I drag a column in the listbox it reorders the grid columns fine. But if I reorder the grid columns in the grid it does not update the listbox. I am willing to disable column ordering in the grid view (and only reorder columns using the listbox) if I have to but would prefer not. I assume I can disable column reorder in the gridview anyway, still looking into it...

     Is there a trick I am missing to get the listbox to reorder when I update the column order from the gridview?

     

                    <telerik:RadListBox x:Name="ColumnSelector" Margin="3" ItemContainerStyle="{StaticResource DraggableListBoxItem}" 
                                        ItemsSource="{Binding Columns,ElementName=GOOSEGrid}">
                        <telerik:RadListBox.DragDropBehavior>
                            <telerik:ListBoxDragDropBehavior />
                        </telerik:RadListBox.DragDropBehavior>
                        <telerik:RadListBox.DragVisualProvider>
                            <telerik:ScreenshotDragVisualProvider />
                        </telerik:RadListBox.DragVisualProvider>
                        <telerik:RadListBox.ItemTemplate>
                            <DataTemplate>
                                <CheckBox Content="{Binding Header}" IsChecked="{Binding IsVisible}"/>
                            </DataTemplate>
                        </telerik:RadListBox.ItemTemplate>
                    </telerik:RadListBox>

  2. Stefan X1
    Admin
    Stefan X1 avatar
    514 posts

    Posted 04 Dec 2015 Link to this post

    Hello David,

    Can you please take a look at the Reordering Columns topic? Basically, you can disable the reordering of RadGridView's columns by setting the CanUserReorderColumns property to "False".

    As to your other requirement, a possible solution might be to use a ListView instead of ListBox and follow the approach demonstrated in the Changing ListView column order programatically forum thread.

    I hope this helps.

    Best Regards,
    Stefan X1
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  3. UI for WPF is Visual Studio 2017 Ready
  4. David
    David avatar
    27 posts
    Member since:
    Apr 2013

    Posted 10 Dec 2015 Link to this post

    Yeah, disable column ordering was trivial but as I mentioned that is really an undesirable backup solution. I would really like to be able to reorder columns by dragging in the ListBox or dragging the column header. Dragging in the ListBox reorders the columns as desired. Dragging the column header does not update the listbox. The link below is a small example that shows this. Dragging column headers in the ListBox reorders the columns in the GridView but dragging columns in the GridView does not reorder the list.

    https://drive.google.com/file/d/0B7XfJajUDQCNOGlfOHJzYkI4SFU/view?usp=sharing

  5. Stefan X1
    Admin
    Stefan X1 avatar
    514 posts

    Posted 14 Dec 2015 Link to this post

    Hi David,

    I reviewed the provided sample application and I would like to point out couple of suggestions. Firstly, please note that RadGridView is a virtualized data-bound control and implementing logic depending on the visibility of its elements is something that we do not recommend. Having this in mind, the current logic for binding the IsChecked property of a CheckBox to the IsVisible property of GridViewDataColumn should be performed on data level. You can take a look at the UI Virtualization topic for more information.

    As to your requirement, a possible approach would be to subscribe to the ColumnReordering event of RadGridView and implement custom logic for reordering the items of the ListBox.

    Additionally, you can take a look at our documentation on DragDropManager.

    I hope this helps.

    Regards,
    Stefan X1
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  6. David
    David avatar
    27 posts
    Member since:
    Apr 2013

    Posted 16 Dec 2015 in reply to Stefan X1 Link to this post

    I had already modified my example to use an observable collection as in intermediary between the grid view's columns and the list box items. Obviously I set the list box's item source to my collection and then initialize it to the grid's columns. Then I handle the collection's CollectionChanged event and reorder the columns in the grid and I handle the grid's ReorderColumn event and update the collection accordingly. This seems to keep the list and column order in sync.

    The visibility still works by binding the IsChecked to the IsVisible property of the column. IsVisible is a property of the column, not the underlying control (which I understand may or may not be present). I understand that binding to the Visibility of the control would not work but it seems like binding to IsVisible would be fine. It is exactly the technique used in the example here http://www.telerik.com/blogs/how-to-column-chooser-for-radgridview-for-silverlight-and-wpf.

    If this is really a problem would it be sufficient to disable column virtualization. My grid will never have more than 20 or 30 columns but may have lots of rows. 

    Thanks

    Dave

     

  7. Stefan X1
    Admin
    Stefan X1 avatar
    514 posts

    Posted 21 Dec 2015 Link to this post

    Hi David,

    Thank you for this clarification.

    I made an investigation on this case and it seems that using the IsVisible property in this scenario would not affect the virtualization of the control, so please excuse me for the misunderstanding.

    Also, even for a scenario with 20-30 columns, you can try setting the GroupRenderMode property of RadGridView to "Flat" for an additional performance boost. You can take a look at the Grouping Modes topic for more information.

    Regards,
    Stefan X1
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Back to Top
UI for WPF is Visual Studio 2017 Ready