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

Posted

技术标签:

【中文标题】ASP.net .FindControl() 和 GridView 返回 null【英文标题】:ASP.net .FindControl() and GridView returning null 【发布时间】:2012-10-31 11:18:07 【问题描述】:

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

我的问题是我的 gridview 总是为空。我在 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 段访问它?

编辑:更改了我的代码 sn-p 以包含匿名模板的信息

【问题讨论】:

你做的时候登录了吗?匿名模板中有什么? 匿名模板只是一个登录屏幕。所有的工作都是通过登录视图完成的 【参考方案1】:

查找子控件的控件是一个经常出现的问题。您可以考虑一种扩展方法,以便您可以轻松调用 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;
         
    

【讨论】:

好吧,这似乎解决了我的问题。非常感谢 其实好像不行。我已经实现了代码,但它似乎总是返回 null,因为我仍然遇到 null 异常问题。 你从来没有回答我的其他问题。你在做的时候登录了吗?匿名模板中有什么?如果您没有登录,那么是的,它将为空。 对不起,我刚来回答这个问题。匿名屏幕只是一个登录屏幕。当我去调试页面时,gridview为null,页面不会加载进行调试,所以它甚至没有给我登录的机会。 如果您没有登录,登录的模板将不存在。将该代码粘贴到您的匿名模板中,您会看到它有效。如果你把你的代码贴在有问题的地方会有帮助。【参考方案2】:

FindControl 只会检查您正在使用它的控件的直接后代。它不会通过 childrens-children 递归地工作。

Jeff Atwood 实际上在博客上写过这个 aaaaggeesss:

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

【讨论】:

以上是关于ASP.net .FindControl() 和 GridView 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 如何取母版页的属性及控件及方法调用求解答

Asp.Net 2.0 PostBackUrl 的问题

关键字“JOIN”附近的语法不正确。使用 asp.net [重复]

asp.net gridview编辑时,下拉框选择上默认的选项

FindControl 和 INamingContainer

从控件外部更改用户控件中的图像按钮