I have a grid with grouping by state. At each level I have check boxes (Header, Group, Detail). If the header is checked, all check boxes are checked. If a group check box is checked, all detail check boxes in that group are checked. If a detail check box is unchecked, the group needs to be unchecked and the header needs to be unchecked. I had to write custom code for this because I could find no imbedded controls to do this for me. I used the code example
as a starting point. My problem is that this is all done server side. I would like it to be client side. I found client side examples that let me select all, but none that did the unselecting when a lower item was unchecked. I have made several attempts at writing the client side code, but have failed.
I am using telerik version 2012.3.1016.4, Visual Basic .Net Framework 4. This needs to work in all (most common) browsers.
Protected
Sub
RadGrid1_ItemCreated(sender
As
Object
, e
As
Telerik.Web.UI.GridItemEventArgs)
If
TypeOf
e.Item
Is
GridHeaderItem
Then
Dim
header
As
GridHeaderItem =
DirectCast
(e.Item, GridHeaderItem)
Dim
headerchkbx
As
New
CheckBox()
headerchkbx.ID =
"CheckBox1"
headerchkbx.AutoPostBack =
True
AddHandler
headerchkbx.CheckedChanged,
AddressOf
headerchkbx_CheckedChanged
header(
"column"
).Controls.Add(headerchkbx)
End
If
If
TypeOf
e.Item
Is
GridGroupHeaderItem
Then
Dim
header
As
GridGroupHeaderItem =
DirectCast
(e.Item, GridGroupHeaderItem)
Dim
groupchkbx
As
New
CheckBox()
groupchkbx.ID =
"CheckBox2"
groupchkbx.AutoPostBack =
True
AddHandler
groupchkbx.CheckedChanged,
AddressOf
groupchkbx_CheckedChanged
header.Controls(0).Controls.Add(groupchkbx)
End
If
If
TypeOf
e.Item
Is
GridDataItem
Then
Dim
header
As
GridDataItem =
DirectCast
(e.Item, GridDataItem)
Dim
detailchkbx
As
New
CheckBox()
detailchkbx.ID =
"CheckBox3"
detailchkbx.AutoPostBack =
True
AddHandler
detailchkbx.CheckedChanged,
AddressOf
detailchkbx_CheckedChanged
header.Controls(0).Controls.Add(detailchkbx)
End
If
End
Sub
Private
Sub
headerchkbx_CheckedChanged(sender
As
Object
, e
As
EventArgs)
Dim
headerchkbx
As
CheckBox =
DirectCast
(sender, CheckBox)
For
Each
groupHeader
As
GridGroupHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.GroupHeader)
Dim
children
As
GridItem() = groupHeader.GetChildItems()
Dim
groupchkbx
As
CheckBox =
DirectCast
(groupHeader.Controls(0).FindControl(
"CheckBox2"
), CheckBox)
For
Each
child
As
GridItem
In
children
Dim
detailchkbx
As
CheckBox =
DirectCast
(child.Controls(0).FindControl(
"CheckBox3"
), CheckBox)
detailchkbx.Checked = headerchkbx.Checked
Next
' If headerchkbx.Checked Then
groupchkbx.Checked = headerchkbx.Checked
'Else
'item.Selected = False
'groupchkbx.Checked = False
'End If
Next
For
Each
item
As
GridHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.Header)
item.Selected = headerchkbx.Checked
Next
End
Sub
Private
Sub
groupchkbx_CheckedChanged(sender
As
Object
, e
As
EventArgs)
Dim
chkCount
As
Integer
= 0
For
Each
groupHeader
As
GridGroupHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.GroupHeader)
Dim
children
As
GridItem() = groupHeader.GetChildItems()
Dim
groupchkbx
As
CheckBox =
DirectCast
(groupHeader.Controls(0).FindControl(
"CheckBox2"
), CheckBox)
If
(groupchkbx.Checked)
Then
chkCount += 1
End
If
For
Each
child
As
GridItem
In
children
Dim
detailchkbx
As
CheckBox =
DirectCast
(child.Controls(0).FindControl(
"CheckBox3"
), CheckBox)
detailchkbx.Checked = groupchkbx.Checked
'Dim dataItem As GridDataItem = TryCast(child, GridDataItem)
'dataItem.Selected = groupchkbx.Checked
For
Each
item
As
GridHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.Header)
Dim
headerchkbx
As
CheckBox =
DirectCast
(item(
"column"
).FindControl(
"CheckBox1"
), CheckBox)
If
(
Not
groupchkbx.Checked)
Then
headerchkbx.Checked =
False
End
If
If
RadGrid1.MasterTableView.GetItems(GridItemType.GroupHeader).Length = chkCount
Then
headerchkbx.Checked =
True
End
If
Next
Next
Next
End
Sub
Private
Sub
detailchkbx_CheckedChanged(sender
As
Object
, e
As
EventArgs)
Dim
totalCount
As
Integer
= 0
Dim
groupCount
As
Integer
= 0
Dim
totalChkCount
As
Integer
= 0
Dim
groupChkCount
As
Integer
= 0
'Loop through all groups
For
Each
groupHeader
As
GridGroupHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.GroupHeader)
Dim
groupchkbx
As
CheckBox =
DirectCast
(groupHeader.Controls(0).FindControl(
"CheckBox2"
), CheckBox)
Dim
grpChildren
As
GridItem() = groupHeader.GetChildItems()
For
Each
child
As
GridItem
In
grpChildren
'Count total number of checkboxes in whole grid and in each group
totalCount += 1
groupCount += 1
Dim
detailchkbx
As
CheckBox =
DirectCast
(child.Controls(0).FindControl(
"CheckBox3"
), CheckBox)
'Count number of checkboxes that are checked in whole grid and in each group
If
(detailchkbx.Checked)
Then
totalChkCount += 1
groupChkCount += 1
End
If
Next
'Check the group check box if all the children are checked
If
groupCount = groupChkCount
Then
groupchkbx.Checked =
True
Else
groupchkbx.Checked =
False
End
If
groupCount = 0
groupChkCount = 0
Next
For
Each
hdr
As
GridHeaderItem
In
RadGrid1.MasterTableView.GetItems(GridItemType.Header)
Dim
headerchkbx
As
CheckBox =
DirectCast
(hdr(
"column"
).FindControl(
"CheckBox1"
), CheckBox)
If
totalCount = totalChkCount
Then
headerchkbx.Checked =
True
Else
headerchkbx.Checked =
False
End
If
Next
End
Sub