我查看了网站上的网页,但似乎无法找到适合我的问题的内容,所以希望有人知道该怎么做。我正在调试别人写的一些代码,并且我遇到了GridView语句的问题。
我的问题是我的gridview始终为null。我在一个LoginView中的面板中有一个声明的GridView,它基本上设置如下。
<asp:LoginView ID="LoginView1" runat="server" onviewchanged="LoginView1_ViewChanged">
<AnonymousTemplate> 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段访问它?
修改:更改了我的代码段,以包含匿名模板的信息
答案 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