evaluating checkbox in datagrid

I have a datagrid that uses a templatecolumn to display a bit value from the database as a checkbox.  The datagrid has update functionality and the one field that I want people to be able to change is to toggle this checkbox.  However I can't figure out how to get at the value of the checkbox.   Relevant code is in three parts although I preusme the problem is in the third part, where the update  statement is found.
When I click update on a row in the grow, I get this error:

System.InvalidCastException was unhandled by user code
  Message="Unable to cast object of type 'System.Web.UI.LiteralControl' to type 'System.Web.UI.WebControls.CheckBox'."
       at WebKinz.Charms.gridFound_Update(Object source, DataGridCommandEventArgs e) in C:\All\Visual Studio 2005\Webkinz\Webkinz\Charms.aspx.cs:line 126
       at System.Web.UI.WebControls.DataGrid.OnUpdateCommand(DataGridCommandEventArgs e)
       at System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e)
       at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args)
       at System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e)
       at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args)
       at System.Web.UI.WebControls.Button.OnCommand(CommandEventArgs e)
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

In the ASPX page, inside the datagrid
<asp:TemplateColumn HeaderText="Have?" SortExpression="found">
                      <asp:CheckBox runat="server" id="chkFound" 
                             Checked='<%#DataBinder.Eval(Container.DataItem,"found") %>'/>
Code for loading the datagrid. This works fine to properly populate the checkboxes in every row
protected void loadGrids(string account,string sort)
            SqlConnection conn = new SqlConnection(c.getConnectionString());
            string queryString = "exec webkinz_charm_forest_all '" + account + "'";
            SqlDataAdapter adpt = new SqlDataAdapter(queryString, conn);
            DataSet ds = new DataSet();
            gridFound.DataSource = ds;
            gridFound.VirtualItemCount = 40;
Also in the .cs file, the udpate statment:
        protected void gridFound_Update(object source, DataGridCommandEventArgs e)
            bool b = ((CheckBox)e.Item.Cells[8].Controls[0]).Checked;
            if (b)
                Label1.Text = "TRUE";
                Label1.Text = "FALSE";

Open in new window

Who is Participating?
Sometimes there is some fun things in a cell that you dont expect.  The grid make liberal use of literals when you dont expect them.  I always try to use the FindControl method.  Your error message indicates to me that control[0] is not a checkbox but a literal.  Try using code like to get the checkbox

The stack trace tells you what is wrong:
 Message="Unable to cast object of type 'System.Web.UI.LiteralControl' to type System.Web.UI.WebControls.CheckBox'."

You have a literal that you're trying to cast to a check box.

Try something like this:
if (((CheckBox)gvr.FindControl("chkid")).Checked == true)  

Taken from this article:

Hope this helps.
deb_holmesAuthor Commented:
I had tried using the FindControl method previously and was getting errors on it too.  Apparently hadn't been putting it in the right place and needed the specific syntax.  This works:
CheckBox chk = (CheckBox)e.Item.Cells[8].FindControl("chkFound");  
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.