Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1751
  • Last Modified:

Gridview: invalid cast error on databound checkbox template field when column hidden

In my Gridview, I have a column "Dinner"

        <asp:GridView ID="gvGuests" runat="server" AutoGenerateColumns="False"
            DataKeyNames="IX_Guest" DataSourceID="dsGuests" OnRowCancelingEdit="gvGuests_RowCancelingEdit" OnRowEditing="gvGuests_RowEditing" OnRowUpdated="gvGuests_RowUpdated" OnPreRender="gvGuests_PreRender">
            <Columns>
.
.
                <asp:TemplateField HeaderText="Dinner" SortExpression="Dinner" >
                    <EditItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("Dinner") %>' />
                    </EditItemTemplate>


which is hidden under a condition in the gridview's preRender handler:


        if ((int)dr.ItemArray[cols.IndexOf("DayCount")] == 1)
        {
            gvGuests.Columns[6].Visible = false;
        }
        else
        {
            gvGuests.Columns[6].Visible = true;
        }


When the user clicks the "edit" button for the row, I get an invalid cast exception on the template field line above.  The culprit is Checked='<%# Bind("Dinner") %>'.

Is there a way to keep a hidden template field from databinding, or is there a cast I should put on the expression?

Thanks


0
Zernk
Asked:
Zernk
  • 3
  • 2
1 Solution
 
nisarkhanCommented:
>> <asp:TemplateField HeaderText="Dinner" SortExpression="Dinner" >

in your code-behind you can make CheckBox1.Visible = false with whatever the condition....

or you can also you use below:

<asp:TemplateField HeaderText="Dinner" SortExpression="Dinner" Visible="false" >

hth
0
 
ZernkAuthor Commented:
I wasn't confident that setting the check box visibility instead of the column visibility would work, but I gave it a try anyway

CheckBox cb = (CheckBox)gvGuests.FindControl("Checkbox1");

returns null

Any idea on how to access Checkbox1?

As the asp code, I need to set the visibility in the code-behind, not in the aspx module.  The explicit value doesn't help my problem.

0
 
nisarkhanCommented:
protected void editGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
  CheckBox chkCheckbox1= e.Row.FindControl("Checkbox1") as CheckBox ;

  if (chkCheckbox1 !=null)
  {
    //todo
  }
}
0
 
ZernkAuthor Commented:
Thanks.  That worked out.  IMO, it's a workaround for a bug in .net.  I think databinding should not occur if a container field or column is not visible.

Here's my code with the problem solved:  
<asp:TemplateField HeaderText="Dinner" SortExpression="Dinner" >
    <EditItemTemplate>
        <asp:CheckBox ID="cbDinner" runat="server" Checked='<%# Bind("Dinner") %>' />
    </EditItemTemplate>
 
 
 
    protected void gvGuests_PreRender(object sender, EventArgs e)
    {
        DataSourceSelectArguments args = new DataSourceSelectArguments();
        DataView dv = (DataView)dsSelectedSession.Select(args);
        DataTable dt = dv.ToTable();
        DataRow dr = dt.Rows[0];
        DataColumnCollection cols = dt.Columns;
        //show dinner for two-day sessions only
        if ((int)dr.ItemArray[cols.IndexOf("DayCount")] == 1)
        {
            gvGuests.Columns[6].Visible = false;
            Session["DayCount"] = 1;
 
        }
        else
        {
            gvGuests.Columns[6].Visible = true;
            Session["DayCount"] = 2;
        }
        
    }
 
    protected void gvGuests_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        CheckBox cbDinner = e.Row.FindControl("cbDinner") as CheckBox;
        if (cbDinner != null)
        {
            if ((int)Session["DayCount"] == 1)
            {
                cbDinner.Visible = false;
            }
        }
    }
 
 
=====================================
=====================================
 
 
This shortcut did not work, because it .net tries to set "checked" before testing "visible".  Lame.
 
<EditItemTemplate>
    <asp:CheckBox ID="cbDinner" runat="server" Visible='<%# IsDinnerVisible() %>' Checked='<%# Bind("Dinner") %>' />
</EditItemTemplate>
 
 
    public bool IsDinnerVisible()
    {
        return((int)Session["DayCount"] == 2)
    }

Open in new window

0
 
ZernkAuthor Commented:
Correction:  It's not that the field shouldn't databind, since that is the work of the Data Source.  What .net shouldn't do is attempt to render a hidden control and cause an exception when the control is hidden.  That, IMO, is a bug.
0

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now