This is a migrated thread and some comments may be shown as answers.

GridViewCheckBoxColumn Header checkbox selects/unselect only current page checkboxes

2 Answers 86 Views
This is a migrated thread and some comments may be shown as answers.
n/a
Top achievements
Rank 1
n/a asked on 25 May 2020, 05:39 AM

Hi,

 

I have one RadGridView for WinForm UI.

I bind data dynamically using DataSource property and bind DataTable that is returned from database.

Before binding datasource, I add a GridViewCheckBoxColumn to the RadGridView (for selecting all rows).

 

following is the sample code:

If RadGridView1.MasterTemplate.Columns.GetColumnByFieldName("").Length = 0 Then
            Dim checkBoxColumn As GridViewCheckBoxColumn = New GridViewCheckBoxColumn("")
            checkBoxColumn.EnableHeaderCheckBox = True
            checkBoxColumn.HeaderCheckBoxAlignment = ContentAlignment.MiddleCenter
            checkBoxColumn.AllowFiltering = False
            checkBoxColumn.CheckFilteredRows = False
            checkBoxColumn.HeaderText = String.Empty

            RadGridView1.MasterTemplate.Columns.Add(checkBoxColumn)
            AddHandler RadGridView1.HeaderCellToggleStateChanged, AddressOf RadGridView1_HeaderCellToggleStateChanged
        End If

 

Later I bind the data table:

RadGridView1.DataSource = dataTable

 

Now, I have 2 problems:

1. Checking / Unchecking header check box, checks/unchecks checkboxes of current page only.  I need to perform the operation for the whole grid.

2. I have got filters on.  User can select filters on columns.  Once filters are applied, records are displayed according to those filters (other records are hidden).  Now, when checking the header check box, it only selects records that are part of current page.  For example, if I am on first page and apply filter on one column, grid will hide all rows from the first page that do not match the filter and pull records from 2nd and 3rd pages that match the criteria and show on the first page.  But if I select check box in the header, then only records from first page are selected, records that came from 2nd and 3rd page are not selected.

 

Kindly help.

 

2 Answers, 1 is accepted

Sort by
0
n/a
Top achievements
Rank 1
answered on 25 May 2020, 10:53 AM

Hi,

I found solution to get only the filtered rows using the "Dataview.Indexer.Items" on the MasterTemplate of RadGridView.

Also, I handled the "HeaderCellToggleStateChanged" event (when header checkbox is checked/unchecked) and looped through all the filtered rows to manually set the checkboxes in rows according to "Header checkbox value".

Following is the code:

Private Sub RadGridView1_HeaderCellToggleStateChanged(ByVal sender As Object, ByVal e As GridViewHeaderCellEventArgs)

        Dim dataView As Telerik.WinControls.UI.GridDataView = TryCast(Me.RadGridView1.MasterTemplate.DataView, GridDataView)
        For Each row As GridViewRowInfo In dataView.Indexer.Items
            row.Cells(0).Value = Convert.ToBoolean(e.State)
        Next

    End Sub

 

Now, the only problem remains is:

1. Header checkbox, when clicked first time, it checks all the data rows but header check box remains unchecked (incorrect behavior.

2. When clicked 2nd time, it gets checked and all data rows are also checked (correct behavior.

3. When clicked 3rd time, it gets unchecked and all data rows are also unchecked (correct behavior)

Subsequent clicks follows steps 1 to 3 on each click.

 

How can I get rid of the 1st step?  (i.e. Header check box remains unchecked and all data rows get checked).

 

0
Nadya
Telerik team
answered on 26 May 2020, 02:08 PM

Hello Betsy,

According to the provided information, it seems that you have enabled paging in your grid. I would like to note that RadGridView exposes two collections that contain data rows:

-Rows - contains all data rows that belong to RadGridView. Data operations such as grouping, sorting, filtering, etc. do not change the content of the collection or the order in which the row objects exist in the collection.

-ChildRows - returns the data rows that are currently represented by RadGridView in the order in which they appear. The collection is modified every time a data operation (grouping, sorting, filtering) occurs.

Similar to filtering, sorting, and grouping, the ChildRows collection is affected by the paging as well and it contains only the records on the current page. More information on this topic you can find here: https://docs.telerik.com/devtools/winforms/controls/gridview/rows/rows-vs-childrows

On the other hand the CheckFilteredRows property indicates whether the hidden rows should be checked by the header checkbox. If you have filtering operation, setting CheckFilteredRows to false it will not mark the hidden rows as checked when the applied filter is removed. And it will work fine in this case. 

I tested the described scenario with both cases that you described on my end and I confirm there is an issue with the header checkbox. This is why I have logged it in our feedback portal by creating a public thread on your behalf. You can track its progress, subscribe for status changes, and add your comments on the following link - feedback item.

I have also updated your Telerik Points.

Following the information in the second post, it seems that you managed to found out a suitable workaround for this but then you have a problem when checking the header checkbox for the first time. In addition I can suggest setting the GridViewCheckBoxColumn.ShouldCheckDataRows to false. Please refer to the attached gif file to see the result on my end.

I have attached my test project as well. Could you please refer to it and see how it works?

I hope this helps. If you have other questions please let me know.

Regards,
Nadya
Progress Telerik

Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
Our thoughts here at Progress are with those affected by the outbreak.
Asked by
n/a
Top achievements
Rank 1
Answers by
n/a
Top achievements
Rank 1
Nadya
Telerik team
Share this question
or