There are cases in which the user would like to retain the state for checkbox control inside GridTemplateColumn on grid operation which requires rebinding. In such situation you can use ViewState property on the page which holds the grid to save the current checkbox selection. The alteration of this property should be made in the OnCheckedChanged event handler of the respective checkbox.

The forthcoming sample presents how to retain the checkbox state in a hierarchical grid after expand/collapse for further custom operations. There are separate ViewState properties for each master/detail table. The example below is optimized for ViewState minimization as these properties are modified only when CheckBoxInstance.Checked is true. Otherwise the row value is not added to the ViewState.

Similar actions could be performed for persistence of other controls state in GridTemplateColumn.

[ASPX/ASCX]
<radg:radgrid id="RadGrid1" runat= "server" AutoGenerateColumns="False" AllowSorting="True" AllowPaging="True" PageSize="3">
      <MasterTableView DataMember="Customers" PageSize="3" AllowPaging="True">
        <PagerStyle Mode="NumericPages"></PagerStyle>
        <Columns>
          ..............
         <radg:GridBoundColumn UniqueName="CustomerID" ReadOnly="True" Display="False" DataField="CustomerID" />
         <radg:GridTemplateColumn UniqueName="MasterTemplate" HeaderText="Checkbox column 1">
           <ItemTemplate>
            <asp:CheckBox ID="cbChecked" Runat="server" AutoPostBack="True" OnCheckedChanged="CheckChanged"></asp:CheckBox>
           </ItemTemplate>
         </radg:GridTemplateColumn>
          ..............
        </Columns>
        <DetailTables>
         <radg:GridTableView DataMember="Customers1" PageSize="3" AllowPaging="True">
           <Columns>
            ...................
            <radg:GridBoundColumn UniqueName="CustomerID" ReadOnly="True" Display="False" DataField="CustomerID" />
            <radg:GridTemplateColumn UniqueName="Child1Template" HeaderText="Checkbox column 2">
              <ItemTemplate>
               <asp:CheckBox id="cbChecked" Runat="server" AutoPostBack="True" OnCheckedChanged="CheckChanged"></asp:CheckBox>
              </ItemTemplate>
            </radg:GridTemplateColumn>
           ....................
           </Columns>
           <DetailTables>
            <radg:GridTableView DataMember="Customers2" PageSize="3"AllowPaging="True">
              <Columns>
              .....................
               <radg:GridBoundColumn UniqueName="CustomerID" ReadOnly="True" Display="False" DataField="CustomerID" />
               <radg:GridTemplateColumn UniqueName="Child2Template" HeaderText="Checkbox column 3">
                 <ItemTemplate>
                  <asp:CheckBox id="cbChecked" Runat="server" AutoPostBack="True" OnCheckedChanged="CheckChanged"></asp:CheckBox>
                 </ItemTemplate>
               </radg:GridTemplateColumn>
              ......................
              </Columns>
            </radg:GridTableView>
           </DetailTables>
         </radg:GridTableView>
        </DetailTables>
  </MasterTableView>
</radg:radgrid>

In code-behind:

[C#]

protected void CheckChanged(Object sender, System.EventArgs e)
{
  CheckBox box = (CheckBox)sender;
  GridDataItem item = (GridDataItem)box.NamingContainer;
  Hashtable target = null;

   if(item.OwnerTableView.DataMember == "Customers")
  {
  target = CustomersChecked;
  }
   else if(item.OwnerTableView.DataMember == "Customers1")
  {
  target = Customers1Checked;
  }
   else
  {
  target = Customers2Checked;
  }

   if(box.Checked)
  {
  target[item[ "CustomerID"].Text] = true;
  }
   else
  {
  target[item[ "CustomerID"].Text] = null;
  }
}

. . .
private Hashtable CustomersChecked
{
  get
 {
  object res = ViewState["_cc"];
  if(res == null)
 {
    res = new Hashtable();
    ViewState[ "_cc"] = res;
 }

  return (Hashtable)res;
 }
}

private Hashtable Customers1Checked
{
  get
 {
  object res = ViewState["_cc1"];
  if(res == null)
 {
    res = new Hashtable();
    ViewState[ "_cc1"] = res;
 }

  return (Hashtable)res;
 }
}

private Hashtable Customers2Checked
{
  get
 {
  object res = ViewState["_cc2"];
  if(res == null)
 {
    res = new Hashtable();
    ViewState[ "_cc2"] = res;
 }

  return (Hashtable)res;
 }
}

[VB.NET]

Private ReadOnly Property CustomersChecked As Hashtable
 Get
  Dim res As Object = ViewState("_cc")
  If (res = Nothing) Then
   res = New Hashtable
   ViewState("_cc") = res
  End If
  Return CType(res,Hashtable)
 End Get
End Property

Private ReadOnly Property Customers1Checked As Hashtable
 Get
  Dim res As Object = ViewState("_cc1")
  If (res = Nothing) Then
   res = New Hashtable
   ViewState("_cc1") = res
  End If
  Return CType(res,Hashtable)
 End Get
End Property

Private ReadOnly Property Customers2Checked As Hashtable
 Get
  Dim res As Object = ViewState("_cc2")
  If (res = Nothing) Then
   res = New Hashtable
   ViewState("_cc2") = res
  End If
  Return CType(res,Hashtable)
 End Get
End Property

Protected Sub CheckChanged(ByVal sender As Object, ByVal e As System.EventArgs)
 Dim box As CheckBox = CType(sender,CheckBox)
 Dim item As GridDataItem = CType(box.NamingContainer,GridDataItem)
 Dim target As Hashtable = Nothing
 If (item.OwnerTableView.DataMember = "Customers") Then
  target = CustomersChecked
 ElseIf (item.OwnerTableView.DataMember = "Customers1") Then
  target = Customers1Checked
 Else
  target = Customers2Checked
 End If
 If box.Checked Then
  target(item("CustomerID").Text) = true
 Else
  target(item("CustomerID").Text) = Nothing
 End If
End Sub