So, I have this situation where I want to update the data in a RadGrid and each row's checkboxes based on what I type in RadAutoCompleteBox control. It seems to work as I want it except for the checkboxes' states. They simply preserve their checked status after I set them to check on Grid's PreRender event and after that you won't be able to manually check them either. If I didn't type anything in the RadAutoCompleteBox control and tried to check any checkbox in the grid they preserve their state. Below is my entire ASPX and C# code. Any help is appreciated.
ASPX code:
<%@ Page Title="Flightdeck - Roles" Language="C#" MasterPageFile="Admin.master" AutoEventWireup="true" CodeBehind="UserGroups.aspx.cs" Inherits="FlightDeck.Configure.Roles" %><asp:Content ID="Content2" ContentPlaceHolderID="ContentAdmin" runat="server"> <div class="main-section clearfix"> <button class="abs-right-btn" runat="server" id="btnAddNewUserGroup"> Add New User Group</button> <h2 class="h2-top-none in-b"> Roles Admin</h2> <hr class="shade-hr" /> <fieldset> <legend></legend> <label class="main-label"> Filter by User:</label> <telerik:RadAutoCompleteBox ID="RadAutoCompleteBox1" runat="server" AutoPostBack="True" OnEntryAdded="RadAutoCompleteBox1_OnEntryAdded" OnEntryRemoved="RadAutoCompleteBox1_OnEntryRemoved" DataSourceID="ObjectDataSource2" Width="400" CssClass="main-input filter-user-input" EmptyMessage="Type a user name" Filter="StartsWith" InputType="Token" DropDownWidth="320px"> </telerik:RadAutoCompleteBox> <asp:ObjectDataSource ID="ObjectDataSource2" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetAllActiveUsers" TypeName="Services.Configure.ConfigureService"> </asp:ObjectDataSource> </fieldset> <div class="admin-left"> <div class="active-roles-table hasblue table-bott"> <h3> Active Roles for <%= SelectedUsers %></h3> <telerik:RadGrid ID="UserGroupsGrid" runat="server" AllowFilteringByColumn="True" CellSpacing="0" DataSourceID="ObjectDataSource1" GridLines="None" AllowPaging="True" AllowSorting="True" AllowMultiRowSelection="True" AutoGenerateColumns="False" Skin="FlightDeckSkin" AllowMultiRowEdit="True" EnableEmbeddedSkins="False" OnPreRender="UserGroupsGrid_OnPreRender" > <ClientSettings AllowColumnsReorder="True" ReorderColumnsOnClient="True"> <Selecting AllowRowSelect="True" EnableDragToSelectRows="True" /> <Resizing AllowColumnResize="True" AllowRowResize="false" ResizeGridOnColumnResize="false" ClipCellContentOnResize="true" EnableRealTimeResize="false" /> </ClientSettings> <MasterTableView DataSourceID="ObjectDataSource1" DataKeyNames="Id" CssClass="zebra-table table1" EditMode="EditForms"> <CommandItemSettings ExportToPdfText="Export to PDF"></CommandItemSettings> <RowIndicatorColumn Visible="True" FilterControlAltText="Filter RowIndicator column"> <HeaderStyle Width="20px"></HeaderStyle> </RowIndicatorColumn> <ExpandCollapseColumn Visible="True" FilterControlAltText="Filter ExpandColumn column"> <HeaderStyle Width="20px"></HeaderStyle> </ExpandCollapseColumn> <EditFormSettings> <EditColumn FilterControlAltText="Filter EditCommandColumn column"> </EditColumn> </EditFormSettings> <Columns> <telerik:GridBoundColumn DataField="Id" FilterControlAltText="Filter Id Column" HeaderText="Id" ReadOnly="True" SortExpression="Id" UniqueName="Id"> <ItemStyle Width="20%"></ItemStyle> <HeaderStyle Width="20%"></HeaderStyle> </telerik:GridBoundColumn> <telerik:GridBoundColumn DataField="Name" FilterControlAltText="Filter Name Column" HeaderText="Name" SortExpression="Name" UniqueName="Name"> <ItemStyle Width="45%"></ItemStyle> <HeaderStyle Width="45%"></HeaderStyle> </telerik:GridBoundColumn> <telerik:GridBoundColumn DataField="Users" FilterControlAltText="Filter Users Column" ReadOnly="True" HeaderText="Users" SortExpression="Users" UniqueName="Users"> <ItemStyle Width="15%"></ItemStyle> <HeaderStyle Width="15%"></HeaderStyle> </telerik:GridBoundColumn> <telerik:GridTemplateColumn AllowFiltering="False"> <ItemTemplate> <asp:LinkButton runat="server" ID="btnEdit" CssClass="edit-table" OnClick="btnEdit_OnClick"></asp:LinkButton> </ItemTemplate> <ItemStyle Width="9%"></ItemStyle> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn AllowFiltering="False"> <ItemTemplate> <asp:LinkButton ID="btnDelete" runat="server" CssClass="delete-x" OnClick="btnDelete_OnClick"></asp:LinkButton> </ItemTemplate> <ItemStyle Width="9%"></ItemStyle> </telerik:GridTemplateColumn> <telerik:GridTemplateColumn UniqueName="CheckBoxTemplateColumn" AllowFiltering="False"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" OnCheckedChanged="ToggleRowSelection" AutoPostBack="True" EnableViewState="True" /> </ItemTemplate> <HeaderTemplate> <asp:CheckBox ID="headerChkbox" runat="server" OnCheckedChanged="ToggleSelectedState" AutoPostBack="True" /> </HeaderTemplate> </telerik:GridTemplateColumn> </Columns> <PagerStyle PageSizeControlType="RadComboBox"></PagerStyle> </MasterTableView> <PagerStyle PageSizeControlType="RadComboBox"></PagerStyle> <FilterMenu EnableImageSprites="False"> </FilterMenu> <HeaderContextMenu EnableEmbeddedSkins="False"> </HeaderContextMenu> </telerik:RadGrid> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="DeleteUserGroups" OldValuesParameterFormatString="original_{0}" SelectMethod="GetUserGroups" TypeName="Services.Configure.ConfigureService" UpdateMethod="UpdateUserGroups"> <DeleteParameters> <asp:Parameter Name="id" Type="Int32" /> </DeleteParameters> <SelectParameters> <asp:SessionParameter Name="userNames" SessionField="SelectedUsers" Type="Object" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="id" Type="Int32" /> <asp:Parameter Name="userId" Type="Int32" /> </UpdateParameters> </asp:ObjectDataSource> </div> </div> <div class="admin-right"> <h3> Selected Roles</h3> <telerik:RadListBox ID="lstSelectedGroups" runat="server" CssClass="main-multiple-select selected-roles-select"> </telerik:RadListBox> <button class="" runat="server" id="btnCancel"> Cancel</button> <button class="dark-btn right" runat="server" id="btnUpdate"> Update</button> </div> </div></asp:Content>
Code behind:
using System;using System.Collections.Generic;using Telerik.Web.UI;using Services.Configure;using System.Web.UI.WebControls;using System.Linq;namespace FlightDeck.Configure{ public partial class Roles : System.Web.UI.Page { public string SelectedUsers; private ConfigureService _service; protected void Page_Init(object sender, EventArgs e) { _service = new ConfigureService(); if (!Page.IsPostBack) { Session["SelectedUsers"] = null; Session["selectedItems"] = null; } } protected void RadAutoCompleteBox1_OnEntryAdded(object sender, AutoCompleteEntryEventArgs e) { var users = new List<string> { e.Entry.Text }; if (Session["SelectedUsers"] == null) { Session["SelectedUsers"] = users; if (users.Count() > 1) users.ForEach(s => SelectedUsers += s + "; "); else { SelectedUsers = users.First(); } } else { users = (List<String>) Session["SelectedUsers"]; users.Add(e.Entry.Text); Session["SelectedUsers"] = users; if (users.Count() > 1) users.ForEach(s => SelectedUsers += s + "; "); else { SelectedUsers = users.First(); } } } protected void RadAutoCompleteBox1_OnEntryRemoved(object sender, AutoCompleteEntryEventArgs e) { if (Session["SelectedUsers"] == null) return; var users = (List<String>)Session["SelectedUsers"]; users.Remove(e.Entry.Text); Session["SelectedUsers"] = users; if (users.Count() > 1) users.ForEach(s => SelectedUsers += s + "; "); else if (users.Count.Equals(0)) { SelectedUsers = string.Empty; } else { SelectedUsers = users.First(); } } protected void btnEdit_OnClick(object sender, EventArgs e) { var id = Convert.ToInt32(((LinkButton) sender).CommandArgument); var service = new ConfigureService(); //service.UpdateUserGroups(id); } protected void btnDelete_OnClick(object sender, EventArgs e) { var id = Convert.ToInt32(((LinkButton)sender).CommandArgument); var service = new ConfigureService(); service.DeleteUserGroups(id); } protected void ToggleRowSelection(object sender, EventArgs e) { ((sender as CheckBox).NamingContainer as GridItem).Selected = (sender as CheckBox).Checked; bool checkHeader = true; foreach (GridDataItem dataItem in UserGroupsGrid.MasterTableView.Items) { if (!(dataItem.FindControl("CheckBox1") as CheckBox).Checked) { checkHeader = false; break; } } GridHeaderItem headerItem = UserGroupsGrid.MasterTableView.GetItems(GridItemType.Header)[0] as GridHeaderItem; (headerItem.FindControl("headerChkbox") as CheckBox).Checked = checkHeader; var checkBox1 = sender as CheckBox; List<string> selectedItemsIds; if (Session["selectedItems"] == null) { selectedItemsIds = new List<string>(); } else { selectedItemsIds = (List<string>)Session["selectedItems"]; } if (checkBox1 != null) { var gridItem = checkBox1.NamingContainer as GridItem; if (gridItem != null) gridItem.Selected = checkBox1.Checked; } var strGroupId = ""; var checkBox = sender as CheckBox; if (checkBox != null && checkBox.Checked) { var dataItem = (GridDataItem)((sender as CheckBox).NamingContainer as GridItem); if (dataItem != null) { strGroupId = dataItem.OwnerTableView.DataKeyValues[dataItem.ItemIndex]["Id"].ToString(); } if (!selectedItemsIds.Any( d => d.Equals(strGroupId))) selectedItemsIds.Add(strGroupId); Session["selectedItems"] = selectedItemsIds; } var box = sender as CheckBox; if (box != null && box.Checked == false) { var dataItem = (GridDataItem)((sender as CheckBox).NamingContainer as GridItem); strGroupId = dataItem.OwnerTableView.DataKeyValues[dataItem.ItemIndex]["Id"].ToString(); selectedItemsIds.Remove(strGroupId); Session["selectedItems"] = selectedItemsIds; } // Refresh the list box with the names of the user groups selected var allGroups = _service.GetAllGroups(); lstSelectedGroups.Items.Clear(); foreach (var id in selectedItemsIds) { var groupId = Convert.ToInt32(id); var userGroupViewModel = allGroups.FirstOrDefault(d => d.Id.Equals(groupId)); if (userGroupViewModel != null) lstSelectedGroups.Items.Add(new RadListBoxItem(userGroupViewModel.GroupName)); } } protected void ToggleSelectedState(object sender, EventArgs e) { CheckBox headerCheckBox = (sender as CheckBox); foreach (GridDataItem dataItem in UserGroupsGrid.MasterTableView.Items) { (dataItem.FindControl("CheckBox1") as CheckBox).Checked = headerCheckBox.Checked; dataItem.Selected = headerCheckBox.Checked; } } protected void UserGroupsGrid_OnPreRender(object sender, EventArgs e) { var users = Session["SelectedUsers"] != null ? (List<String>)Session["SelectedUsers"] : new List<string>(); var groupIds = _service.GetAllGroups(users).Where(d => d.Selected).Select(d => d.Id).ToList(); // get all group ids that should be marked as selected after the users had been picked if (users.Any()) { // Find rows that all picked users belong to and mark the check box for that row foreach ( var dataItem in UserGroupsGrid.MasterTableView.Items.OfType<GridDataItem>() .Where( d => groupIds.Any( i => i.Equals(Convert.ToInt32(d.OwnerTableView.DataKeyValues[d.ItemIndex]["Id"])))) ) { dataItem.Selected = true; var checkBox = dataItem.FindControl("CheckBox1") as CheckBox; if (checkBox != null) checkBox.Checked = true; } } else { if (Session["selectedItems"] != null) { var selectedItemsIds = ((List<string>) Session["selectedItems"]).Select(d => Convert.ToInt32(d)).ToList(); var selectedGridItems = UserGroupsGrid.MasterTableView.Items.OfType<GridDataItem>() .Where(item => selectedItemsIds.Any(d => d.Equals( Convert.ToInt32(item.OwnerTableView.DataKeyValues[item.ItemIndex]["Id"])))) .ToList(); foreach (var dataItem in selectedGridItems) { dataItem.Selected = true; var checkBox = dataItem.FindControl("CheckBox1") as CheckBox; if (checkBox != null) checkBox.Checked = true; } } } } }}