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'."
  Source="Webkinz"
  StackTrace:
       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">
                    <ItemTemplate>
                      <asp:CheckBox runat="server" id="chkFound" 
                             Checked='<%#DataBinder.Eval(Container.DataItem,"found") %>'/>
                    </ItemTemplate>
                </asp:TemplateColumn>
 
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());
            conn.Open();
            string queryString = "exec webkinz_charm_forest_all '" + account + "'";
            SqlDataAdapter adpt = new SqlDataAdapter(queryString, conn);
            DataSet ds = new DataSet();
            adpt.Fill(ds);
            gridFound.DataSource = ds;
            gridFound.DataBind();            
            gridFound.VirtualItemCount = 40;
            conn.Close();
        }
 
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";
            }
            else
            {
                Label1.Text = "FALSE";
            }
{

Open in new window

deb_holmesAsked:
Who is Participating?
 
wht1986Commented:
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

e.Item.FindControl("chkFound")
or
e.Item.Cells[8].FindControl("chkFound")
0
 
newbiealCommented:
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:
http://www.ilearnttoday.com/index.php/c-aspnet-gridview-select-multiple-rows-in-a-grid-view-using-check-boxes

Hope this helps.
0
 
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");  
Thanks!            
0
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.