Reputation: 7571
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
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