ASP.net .FindControl()和GridView返回null

时间:2012-11-12 00:03:02

标签: c# asp.net gridview findcontrol

我查看了网站上的网页,但似乎无法找到适合我的问题的内容,所以希望有人知道该怎么做。我正在调试别人写的一些代码,并且我遇到了GridView语句的问题。

我的问题是我的gridview始终为null。我在一个LoginView中的面板中有一个声明的GridView,它基本上设置如下。

<asp:LoginView ID="LoginView1" runat="server" onviewchanged="LoginView1_ViewChanged">
<AnonymousTemplate>&nbsp;Please <a href="../Default.aspx"> Log In </a></AnonymousTemplate>
<LoggedInTemplate>
        <asp:Panel ID="Panel1" runat="server">
            <asp:GridView ID="GridView1" runat="server" 
                AutoGenerateColumns="False" CellPadding="2" 
                DataSourceID="SqlDataSource1" ForeColor="Black" GridLines="Horizontal" 
                BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" 
                BorderWidth="1px" Width="970px" OnRowCommand="GridView1_RowCommand" 
                PageSize="40" AllowSorting="True">

之后,在C#文件中,我有以下声明

   GridView GridView1 = (GridView)LoginView1.FindControl("GridView1");

当我去运行代码时,我在GridView1上得到了NullRefrenceException。我是否需要深入了解面板以引用GridView,或者我是否应该能够从主LoginView1段访问它?

修改:更改了我的代码段,以包含匿名模板的信息

2 个答案:

答案 0 :(得分:2)

查找子控件的控件是一个很大的问题。您可以考虑使用扩展方法,这样您就可以轻松调用Jeff Atwood的递归子控件(在Simon的答案中引用)......或者您编写的任何版本。这只是使用其他帖子中的代码的示例:

GridView GridView1 = (GridView)LoginView1.FindControlRecursive("GridView1");

这是代码。

public static class WebControlExtender
    {
        public static Control FindControlRecursive(this Control root, string id)
        {
            if (root.ID == id)
            {
                return root;
            }

            foreach (Control c in root.Controls)
            {
                Control t = FindControlRecursive(c, id);
                if (t != null)
                {
                    return t;
                }
            }

            return null;
        } 
    }

答案 1 :(得分:1)

FindControl只会检查您正在使用它的控件的直接后代。它不会通过儿童 - 孩子递归递送。

杰夫阿特伍德实际上曾在博客中写过这篇文章:

http://www.codinghorror.com/blog/2005/06/recursive-pagefindcontrol.html