3

我已经查看了网站上的页面,但似乎找不到适合我的问题的一般性内容,所以希望有人知道该怎么做。我正在调试其他人编写的一些代码,并且遇到了 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 段访问它?

编辑:更改了我的代码片段以包含匿名模板的信息

4

2 回答 2

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;
        } 
    }
于 2012-11-12T00:45:47.060 回答
1

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

杰夫·阿特伍德(Jeff Atwood)实际上在博客上写过这个 aaaaggeesss:

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

于 2012-11-12T00:10:00.840 回答