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

RadGrid, Checkboxes and RadAutoCompleteBox

1 Answer 174 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Anthony
Top achievements
Rank 1
Anthony asked on 05 Jun 2013, 06:19 PM

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;
                    }
 
                }
            }
 
        }
       
    }
}

1 Answer, 1 is accepted

Sort by
0
Anthony
Top achievements
Rank 1
answered on 06 Jun 2013, 04:17 PM
Somehow I fixed this, although I'm not sure exactly how.
Tags
Grid
Asked by
Anthony
Top achievements
Rank 1
Answers by
Anthony
Top achievements
Rank 1
Share this question
or