Advertisement

08.14.2008 at 03:29PM PDT, ID: 23649955
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

6.4

CheckBox state is not saving or updating properly in ViewState

Asked by knowlton in Programming for ASP.NET

CheckBox state is not saving or updating properly in ViewState.

I have a GridView with Pager buttons.

The very first time the page loads, I am presented with Page 1 with 10 items.

I check the first two rows  (ID 1 and 2)

Then I click on the Pager Button for Page 2

When Page 2 loads....items (ID 11 and 12) are checked.


POSITIONALLY  the checks match the first Page.  Same for Page 3 and 4 and 5 etc. etc.


But obviously this is WRONG ...  since I actually had not previously visited those pages or checked any boxes.



Now I went and copied the View Source for Page 1 vs Page 2 for those ROWS that are keeping the same check marks.

Here is what I found:


Page ONE:

            </tr><tr>
                  <td><span title="1"><input id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl02$rowCB" checked="checked" /></span></td><td>1</td><td>Directory Submissions - 25</td><td>Submit clients domain to 25 directories using specified keywords in the anchor text.&lt;br&gt;</td>
            </tr><tr>
                  <td><span title="2"><input id="CO2SearchResults1_GridViewSearchResults_ctl03_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl03$rowCB" checked="checked" /></span></td><td>2</td><td>Directory Submissions - 50</td><td>Submit clients domain to 50 directories using specified keywords in the anchor text.</td>
            </tr><tr>
                  <td><span title="3"><input id="CO2SearchResults1_GridViewSearchResults_ctl04_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl04$rowCB" /></span></td><td>3</td><td>Directory Submissions - 100</td><td>Submit clients domain to 100 directories using specified keywords in the anchor text.</td>
            </tr><tr>
                  <td><span title="4"><input id="CO2SearchResults1_GridViewSearchResults_ctl05_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl05$rowCB" /></span></td><td>4</td><td>Directory Submissions - 150</td><td>Submit clients domain to 150 directories using specified keywords in the anchor text.&lt;br&gt;</td>
            </tr><tr>


PAGE TWO:


            </tr><tr>
                  <td><span title="11"><input id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl02$rowCB" checked="checked" /></span></td><td>11</td><td>SEO Setup</td><td>General Setup task to bill for out of the ordinary setup requirements.&lt;br&gt;</td>
            </tr><tr>
                  <td><span title="12"><input id="CO2SearchResults1_GridViewSearchResults_ctl03_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl03$rowCB" checked="checked" /></span></td><td>12</td><td>Duplicate Content Analysis I</td><td>Check for duplicate content issues and provide any necessary recommendations to promote unique content.&lt;br&gt;</td>
            </tr><tr>
                  <td><span title="13"><input id="CO2SearchResults1_GridViewSearchResults_ctl04_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl04$rowCB" /></span></td><td>13</td><td>Duplicate Content Analysis II</td><td>Check for duplicate content issues and provide any necessary recommendations to promote unique content.&lt;br&gt;</td>
            </tr><tr>
                  <td><span title="14"><input id="CO2SearchResults1_GridViewSearchResults_ctl05_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl05$rowCB" /></span></td><td>14</td><td>Heading Tag Edits I</td><td>Page by page header tag (&amp;lt;h1&amp;gt;, &amp;lt;h2&amp;gt;) recommendations.&lt;br&gt;</td>
            </tr><tr>




ANALYSIS:

PAGE ONE FIRST DATA ROW:

<td><span title="1"><input id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl02$rowCB" checked="checked" /></span></td><td>1</td><td>Directory Submissions - 25</td><td>Submit clients domain to 25 directories using specified keywords in the anchor text.&lt;br&gt;</td>

PAGE TWO FIRST DATA ROW:

<td><span title="11"><input id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB" type="checkbox" name="CO2SearchResults1$GridViewSearchResults$ctl02$rowCB" checked="checked" /></span></td><td>11</td><td>SEO Setup</td><td>General Setup task to bill for out of the ordinary setup requirements.&lt;br&gt;</td>


ID VALUE FOR FIRST PAGE FIRST ROW:

id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB"

ID VALUE FOR SECOND PAGE FIRST ROW:

id="CO2SearchResults1_GridViewSearchResults_ctl02_rowCB"



THEY MATCH.


This is why I think they are always getting checked.


How can I force each page to have UNIQUE NAMING for the ROWS?Start Free Trial
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
 
//Sorting, Paging and CheckBox state preservation -- seem to be stable now
 
public partial class UserControls_Workflow_CO2SearchResults : System.Web.UI.UserControl
{
	private string _workflowConnectionString = ConfigurationManager.ConnectionStrings["WORKFLOWConnection"].ConnectionString;
 
	private DataSet _ds;
 
	//PROPERTY NOT IMPLEMENTED YET - NOT BEING USED YET
	public DataSet CurrentDataSource
	{
		get
		{
			return _ds;
		}
 
		set
		{
			_ds = value;
		}
	}
	
	protected void Page_Load( object sender, EventArgs e )
	{
		string tempArgument = Request.Params.Get("__EVENTARGUMENT");
	
		//INITIALIZATION
		if (!Page.IsPostBack)
		{
			string[] DataKeyNames = { "ID" };
			ViewState["DataKeyNames"] = DataKeyNames;
			ViewState["SortExp"] = DataKeyNames.GetValue(0);
			ViewState["SortDir"] = SortDirection.Descending;
			ViewState["PageIndex"] = 0;
			LocalSelectAllWorkitemTypes();
			this.BuildGridView(true);			
		}
				
		//THE "CHECK ALL" CHECKBOX IN THE HEADER WAS CLICKED
		if (tempArgument == "CHECKALL")
		{
			bool statepassedin = false;
 
			string newpageindex = Request.Params.Get("__EVENTTARGET");
			if (newpageindex == "true")
			{
				statepassedin = true;
			}
 
			this.HandleCheckAllClick(statepassedin);
		}
 
		GatherCheckBoxStatus();
 
		//A PAGER BUTTON WAS CLICKED
		if (tempArgument == "PAGERBUTTON")
		{
			string newpageindex = Request.Params.Get("__EVENTTARGET");
			int adjustedPageIndex = Int32.Parse(newpageindex) - 1;
			ViewState["PageIndex"] = adjustedPageIndex;			
			this.BuildGridView(false);
		}
	}
 
	//PRESERVE THE CHECKBOX STATUS ACROSS POSTBACKS (SORTING AND PAGING)
	private void GatherCheckBoxStatus()
	{
		if ((DataSet)ViewState["DataStore"] != null)
		{
			DataSet ds = (DataSet)ViewState["DataStore"];
 
			for (int i = 0; i < this.GridViewSearchResults.Rows.Count; i++)
			{
				bool state = ((CheckBox)this.GridViewSearchResults.Rows[i].Cells[0].Controls[0]).Checked;
				string tempID = ((CheckBox)this.GridViewSearchResults.Rows[i].Cells[0].Controls[0]).ToolTip;
 
				foreach (DataRow dr in ds.Tables[0].Rows)
				{
					if (dr[this.GridViewSearchResults.DataKeyNames[0].ToString()].ToString() == tempID)
					{
						dr["chk"] = state;
					}
				}
			}
			ViewState["DataStore"] = ds;
		}		
	}
 
	//BUILD A TEMPORARY DATASET
	//FUTURE VERSIONS SHOULD USE A PROPERTY FOR THIS
	public DataSet LocalSelectAllWorkitemTypes()
	{
		DataSet ds = new DataSet();
 
		if (ViewState["DataStore"] == null)
		{
			using (SqlConnection connection = new SqlConnection(_workflowConnectionString))
			{
				using (SqlCommand command = new SqlCommand("SelectAllWorkitemTypesTEST", connection))
				{
					command.CommandType = CommandType.StoredProcedure;
					using (SqlDataAdapter adapter = new SqlDataAdapter(command))
					{
						adapter.Fill(ds);
					}
				}
			}
 
			bool chkBool = false;
 
			ds.Tables[0].Columns.Add("chk", chkBool.GetType());
 
			ViewState["DataStore"] = ds;
			return ds;
		}
		else
		{
			return (DataSet)ViewState["DataStore"];
		}
	}
 
	//CLEAR ALL COLUMNS AND REBUILD THE GRIDVIEW PROGRAMMATICALLY
	private void BuildGridView(bool ToggleSort)
	{
		DataSet ds = (DataSet)ViewState["DataStore"];
		this.GridViewSearchResults.AutoGenerateColumns = false;
		this.GridViewSearchResults.DataKeyNames = (string[])ViewState["DataKeyNames"];
		this.GridViewSearchResults.Columns.Clear();
		this.GridViewSearchResults.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
 
		CheckBoxField cbf = new CheckBoxField();
		cbf.DataField = ds.Tables[0].Columns["chk"].ToString();
		cbf.HeaderText = "";
		cbf.HeaderStyle.ForeColor = System.Drawing.Color.White;
		cbf.HeaderStyle.BackColor = System.Drawing.Color.Black;	
 
		this.GridViewSearchResults.Columns.Add(cbf);
 
		foreach (DataColumn dc in ds.Tables[0].Columns)
		{
			if (dc.ColumnName != "chk")
			{
			
				BoundField bf = new BoundField();				
				
				
 
				bf.HeaderText = dc.ColumnName;
				bf.DataField = dc.ColumnName;
				bf.HeaderStyle.ForeColor = System.Drawing.Color.White;
				bf.HeaderStyle.BackColor = System.Drawing.Color.Black;
				bf.SortExpression = dc.ColumnName;
 
				this.GridViewSearchResults.Columns.Add(bf);
			}
		}
 
		string sortExp = (string)ViewState["SortExp"];
		SortDirection sd = (SortDirection)ViewState["SortDir"];
		string sortDir = "";
 
		if (ToggleSort)
		{
			if (sd == SortDirection.Ascending)
			{
				sortDir = " DESC";
				ViewState["SortDir"] = SortDirection.Descending;
			}
			else
			{
				sortDir = " ASC";
				ViewState["SortDir"] = SortDirection.Ascending;
			}
			ds.Tables[0].DefaultView.Sort = sortExp + sortDir;
		}
		else
		{
			if (sd == SortDirection.Ascending)
			{
				sortDir = " ASC";
			}
			else
			{
				sortDir = " DESC";
			}
			ds.Tables[0].DefaultView.Sort = sortExp + sortDir;
		}		
		
		this.GridViewSearchResults.DataSource = ds.Tables[0].DefaultView;
		this.GridViewSearchResults.PageIndex = (int)ViewState["PageIndex"];	
		ViewState["DataStore"] = ds;
		this.GridViewSearchResults.DataBind();
	}
 
	//TOGGLE THE "CHECK ALL" STATE ON OR OFF
	private void HandleCheckAllClick(bool statepassedin)
	{
		DataSet ds = (DataSet)ViewState["DataStore"];
 
		foreach (DataRow dr in ds.Tables[0].Rows)
		{
			if (dr["chk"] != null)
			{
				dr["chk"] = statepassedin;
			}
		}
 
		ViewState["DataStore"] = ds;		
		BuildGridView(false);
	}
 
	protected void GridViewSearchResults_RowDataBound( object sender, GridViewRowEventArgs e)
	{
		//ADD CHECKBOX TO HEADER ROW (TO SUPPORT "CHECK ALL" FUNCTIONALITY)
		if (e.Row.RowType == DataControlRowType.Header)
		{
			try
			{
				CheckBox cb = new CheckBox();
				cb.ID = "newchecked";
				cb.Attributes.Add("onclick", "CheckAllClicked(this)");				
				TableCell tc = new TableCell();
 
				tc.ID = "tc";
				tc.BackColor = System.Drawing.Color.Black;
				tc.Style.Add("border-bottom-style", "none");				
				e.Row.Cells.AddAt(0, tc);
				e.Row.Cells[0].Controls.Add(cb);
				e.Row.ToolTip = "header";
			}
			catch (Exception ee)
			{
				System.Diagnostics.Debug.WriteLine(ee.ToString());
			}
		}
 
		//ADD TOOLTIP (DATA KEY NAMES) TO CHECKBOX FOR USE LATER WHILE GATHERING CHECK BOX STATE
		if (e.Row.RowType == DataControlRowType.DataRow)
		{
			((CheckBox)((TableCell)((DataControlFieldCell)e.Row.Cells[0])).Controls[0]).Enabled = true;
			string ID = ((DataRowView)e.Row.DataItem)[this.GridViewSearchResults.DataKeyNames[0]].ToString();
			((CheckBox)((TableCell)((DataControlFieldCell)e.Row.Cells[0])).Controls[0]).ID = "rowCB";
			((CheckBox)((TableCell)((DataControlFieldCell)e.Row.Cells[0])).Controls[0]).ToolTip = ID;
		}
 
 
		//BUILD CUSTOM PAGER
		if (e.Row.RowType == DataControlRowType.Pager)
		{
			DataSet ds = new DataSet();
 
			ds = (DataSet)ViewState["DataStore"];
 
			if (ds.Tables[0].Rows.Count > 0)
			{
				int recordcount = ds.Tables[0].Rows.Count;
				int pagecount = recordcount / this.GridViewSearchResults.PageSize;
 
				for (int i = 0; i <= pagecount; i++)
				{
					Button pagerBtn = new Button();
					
					pagerBtn.Attributes.Add("onclick", "RespondToPagerClick(this)");
					pagerBtn.ID = "pagerBtn" + i.ToString();
 
					pagerBtn.Text = (i + 1).ToString();
 
 
					if (ViewState["PageIndex"] != null)
					{
						if (i == (int)ViewState["PageIndex"])
						{
							pagerBtn.Enabled = false;
							pagerBtn.Style.Add(HtmlTextWriterStyle.BorderColor, "Red");
						}
						else
						{
							pagerBtn.Enabled = true;
						}
					}
 
					PlaceHolder ph = (PlaceHolder)e.Row.FindControl("phPager");
 
					Label countItems = (Label)e.Row.FindControl("LabelTotalWorkItems");
 
					countItems.Text = ("(" + recordcount.ToString() + " total results)");
 
					ph.Controls.Add(pagerBtn);
				}
			}
		}
	}
		
 
	protected void GridViewSearchResults_Sorting( object sender, GridViewSortEventArgs e )
	{
		ViewState["SortExp"] = e.SortExpression;		
		BuildGridView(true);	
	}
}
 
Loading Advertisement...
 
[+][-]08.14.2008 at 03:34PM PDT, ID: 22234887

View this solution now by starting your 7-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

 

About this solution

Zone: Programming for ASP.NET
Sign Up Now!
Solution Provided By: knowlton
Participating Experts: 0
Solution Grade: A
 
 
 
Loading Advertisement...
20081112-EE-VQP-42 / EE_QW_EXPERT_20070906