Sreedhar Danturthi
Sreedhar Danturthi

Reputation: 7571

persistence of checkbox values in Gridview on paging asp.net/c#

I want to persist the check box values on selection of items displayed in grid view.

This is the code in gridviewpage.aspx which creates the gridview:

 <form id="form1" runat="server">
    <div>
       <asp:GridView ID="GridView1" runat="server" 
        AutoGenerateColumns = "False" Font-Names = "Arial" 
        Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B"  
        HeaderStyle-BackColor = "green" AllowPaging ="True"   
        OnPageIndexChanging = "OnPaging1xxx" OnRowDataBound = "RowDataBound" 
            AllowSorting="True" DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" >
       <Columns>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "CustomerID" 
               HeaderText = "CustomerID" ReadOnly="True" SortExpression="CustomerID" />
        <asp:BoundField ItemStyle-Width = "150px" DataField = "City" HeaderText = "City" 
               SortExpression="City"/>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "Country" 
               HeaderText = "Country" SortExpression="Country"/>
        <asp:BoundField ItemStyle-Width = "150px" DataField = "PostalCode" 
               HeaderText = "PostalCode" SortExpression="PostalCode"/>
               <asp:TemplateField>
                <ItemTemplate>
                <asp:CheckBox id="CheckBox1" runat="server" onclick="Check_Click(this)"/>
                </ItemTemplate>
                <HeaderTemplate>
                <asp:CheckBox id="chkAll" runat="server" Text="Select All" onclick="checkAll(this)"/>
                </HeaderTemplate>
               </asp:TemplateField>
       </Columns> 
       <AlternatingRowStyle BackColor="#C2D69B"  />

<HeaderStyle BackColor="Green"></HeaderStyle>
    </asp:GridView> 
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="Data Source=SDANTURTHI-PC;Initial Catalog=ArticleDB;Integrated Security=True" 
            ProviderName="System.Data.SqlClient" 
            SelectCommand="SELECT [CustomerID], [City], [Country], [PostalCode] FROM [Customers]">
        </asp:SqlDataSource>
    </div>

This is the code in gridviewpage.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;
using System.IO.Compression;  

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {        
        ArrayList CheckBoxArray;
        if (ViewState["CheckBoxArray"] != null)
        {
            CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
        }
        else
        {
            CheckBoxArray = new ArrayList();
        }

        if (IsPostBack)
        {
            int CheckBoxIndex;
            bool CheckAllWasChecked=false;
            CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll");
            string checkAllIndex = "chkAll-" + GridView1.PageIndex;
            if (chkAll.Checked)
            {                
                if (CheckBoxArray.IndexOf(checkAllIndex) == -1)
                {
                    CheckBoxArray.Add(checkAllIndex);
                }
            }
            else 
            {
                if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
                {
                    CheckBoxArray.Remove(checkAllIndex);
                    CheckAllWasChecked = true;
                }
            }
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
                {
                    CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                    CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1);
                    if (chk.Checked)
                    {
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1 && !CheckAllWasChecked)
                        {
                            CheckBoxArray.Add(CheckBoxIndex);
                        }
                    }
                    else 
                    {
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1 || CheckAllWasChecked)
                        {
                            CheckBoxArray.Remove(CheckBoxIndex);
                        }
                    }
                }
            }
        }
       ViewState["CheckBoxArray"] = CheckBoxArray;

       GridView1.DataBind();
    }  

    protected void OnPaging1xxx(object sender, GridViewPageEventArgs e)
    {

        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataBind();
        if (ViewState["CheckBoxArray"] != null)
        {
            ArrayList CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
            string checkAllIndex = "chkAll-" + GridView1.PageIndex;

            if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
            {
                CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll");
                chkAll.Checked = true;
            }
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {

                if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
                {
                    if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
                    {
                        CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                        chk.Checked = true;
                        GridView1.Rows[i].Attributes.Add("style","background-color:aqua");      
                    }
                    else
                    {
                        int CheckBoxIndex = GridView1.PageSize * (GridView1.PageIndex) + (i + 1);
                        if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1)
                        {
                            CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1");
                            chk.Checked = true;
                            GridView1.Rows[i].Attributes.Add("style", "background-color:aqua");
                        }
                    }
                }
            }
        }
    }
    protected void RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover", "MouseEvents(this, event)");
            e.Row.Attributes.Add("onmouseout", "MouseEvents(this, event)");
        }
    }
}

It is not able to persist the values, but when i debug the checkboxarray and viewstate["checkboxarray"] seem to possessing the right values. I don't understand why it is not working. Please help me. Thank you in anticipation

Upvotes: 1

Views: 4890

Answers (1)

Vincent Vancalbergh
Vincent Vancalbergh

Reputation: 3327

Do note that ViewState only "works" on the trip from the server to the browser. You can't expect it to still be there on the post back.

Persisting it would require using Session.

EDIT

Anything that you want to get back to the server you need to either put it in a form
-> It'll be in Request.Form["blabla"]
or in the querystring (mypage.aspx?blabla=somevalue)
-> It'll be in Request.QueryString["blabla"]

Those are the only two ways to get data from the server to your page.

(Addendum:

This is slightly hidden from you when your controls trigger events that you handle in your code-behind cs file. ASP.NET wraps the controls in a form and does a post back -> you run your code -> an updated page is sent back)

EDIT

Your checkboxes are in Request.Form[..] as "CheckBox1xxx" with xxx being a row number. This row number will be relatively meaningless to you.

My recommendation is to loop through the values in Request.Form and see which ones start with "CheckBox1" (like here), extract the row number, get the value for "CustomerIDxxx" and use that to match with the correct Record.

Upvotes: 1

Related Questions