FindControl() returns NULL when object exists in Template?

Discussion in 'ASP .Net' started by James G. Beldock, Aug 7, 2003.

  1. I have seen the following behavior: when issuing a Page.FindControl() for a
    control which exists in an item template (from within an ItemDataBound()
    event, for example), I get nulls back regularly. Has anyone seen this
    before? It's pretty aggravating to have to iterate through the controls in
    each grid cell to find the ones I need, especially since finding those cells
    is not always easy. Here's my ItemDataBound() handler:

    private void streetAddressGrid_EditCommand(object source,
    System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    streetAddressGrid.EditItemIndex = e.Item.ItemIndex;
    streetAddressGrid.DataBind();
    DB.DbStreet_Address sa = new DB.DbStreet_Address();
    sa.Street_Address_ID=
    (SqlInt32)System.Convert.ToInt32((e.Item.Cells[0].Controls[1] as
    Label).Text);
    sa.SelectOne();

    // exceptions begin here; even though these controls exist, FindControl()
    returns null
    (e.Item.FindControl("line_1") as TextBox).Text = sa.Line_1.ToString();
    (e.Item.FindControl("line_2") as TextBox).Text = sa.Line_2.ToString();
    (e.Item.FindControl("line_3") as TextBox).Text = sa.Line_3.ToString();
    (e.Item.FindControl("city") as TextBox).Text = sa.City.ToString();
    (e.Item.FindControl("state") as TextBox).Text = sa.State.ToString();
    (e.Item.FindControl("postal_code") as TextBox).Text =
    sa.Postal_Code.ToString();
    (e.Item.FindControl("country") as TextBox).Text = sa.Country.ToString();
    }

    Any thoughts would be appreciated!

    Thanks,
    /s/ James
     
    James G. Beldock, Aug 7, 2003
    #1
    1. Advertising

  2. Re: Solved - but WHY? (was Re: FindControl() returns NULL when object exists in Template?)

    The reason is that the FindControl() method of Control is object-specific,
    meaning that it doesn't act recursively, going down into nested levels of
    Controls within a Control. The Page object is the top-level Control, and
    other than a bunch of LiteralControls created by the HTML in the Template,
    all you will find in its Controls Collection is the runat=server Form on the
    Page.

    --
    HTH,

    Kevin Spencer
    Microsoft MVP
    ..Net Developer
    http://www.takempis.com
    Complex things are made up of
    lots of simple things.

    "James G. Beldock" <the word newsgroups at the domain beldock dot org> wrote
    in message news:...
    > It appears that calling the Grid's FindControl() within the Items

    collection
    > does the trick:
    >
    > (streetAddressGrid.Items[e.Item.ItemIndex].FindControl("line_1") as
    > TextBox).Text = sa.Line_1.ToString()
    >
    > So, anyone know why?
    >
    >
    >
    > /s/ J
    >
    >
    >
    > "James G. Beldock" <the word newsgroups at the domain beldock dot org>

    wrote
    > in message news:...
    > > I have seen the following behavior: when issuing a Page.FindControl()

    for
    > a
    > > control which exists in an item template (from within an ItemDataBound()
    > > event, for example), I get nulls back regularly. Has anyone seen this
    > > before? It's pretty aggravating to have to iterate through the controls

    > in
    > > each grid cell to find the ones I need, especially since finding those

    > cells
    > > is not always easy. Here's my ItemDataBound() handler:
    > >
    > > private void streetAddressGrid_EditCommand(object source,
    > > System.Web.UI.WebControls.DataGridCommandEventArgs e)
    > > {
    > > streetAddressGrid.EditItemIndex = e.Item.ItemIndex;
    > > streetAddressGrid.DataBind();
    > > DB.DbStreet_Address sa = new DB.DbStreet_Address();
    > > sa.Street_Address_ID=
    > > (SqlInt32)System.Convert.ToInt32((e.Item.Cells[0].Controls[1] as
    > > Label).Text);
    > > sa.SelectOne();
    > >
    > > // exceptions begin here; even though these controls exist,

    FindControl()
    > > returns null
    > > (e.Item.FindControl("line_1") as TextBox).Text = sa.Line_1.ToString();
    > > (e.Item.FindControl("line_2") as TextBox).Text = sa.Line_2.ToString();
    > > (e.Item.FindControl("line_3") as TextBox).Text = sa.Line_3.ToString();
    > > (e.Item.FindControl("city") as TextBox).Text = sa.City.ToString();
    > > (e.Item.FindControl("state") as TextBox).Text = sa.State.ToString();
    > > (e.Item.FindControl("postal_code") as TextBox).Text =
    > > sa.Postal_Code.ToString();
    > > (e.Item.FindControl("country") as TextBox).Text = sa.Country.ToString();
    > > }
    > >
    > > Any thoughts would be appreciated!
    > >
    > > Thanks,
    > > /s/ James
    > >
    > >

    >
    >
     
    Kevin Spencer, Aug 7, 2003
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rimu Atkinson
    Replies:
    2
    Views:
    3,023
    Rimu Atkinson
    Feb 3, 2004
  2. MattB
    Replies:
    2
    Views:
    4,680
    Scott Allen
    Feb 16, 2005
  3. vizlab
    Replies:
    3
    Views:
    4,208
    Michael Bar-Sinai
    Oct 17, 2007
  4. Replies:
    5
    Views:
    26,680
    Mike Schilling
    Mar 29, 2006
  5. Col
    Replies:
    1
    Views:
    626
    peter koch
    Apr 21, 2006
Loading...

Share This Page