我正在尝试从App_Code目录中的类文件访问表单控件,但我不断收到消息“对象引用未设置为对象的实例。”
不确定我在哪里失败,但这是代码:
public static void openPage(Page page)
{
DropDownList eventType = (DropDownList)page.FindControl("eventType");
if (eventType.SelectedItem.Text == "Big Party")
{
DoSomeWork(); //should be changing values or visible options on the page
}
}
我正在从我的页面调用它:
Workflow.openPage(this);
它一直告诉我问题来自:if (eventType.SelectedItem.Text == "Big Party")
有什么想法吗?
答案 0 :(得分:1)
看起来page.FindControl()
似乎正在返回null
。无论如何,那是我第一个看的地方。确保正确键入控件名称,并且在调用此方法时,控件名称存在于生命周期中的页面上。
答案 1 :(得分:1)
您获得“对象引用未设置为对象实例”的原因。是因为FindControl返回null,并且您正在尝试derefrence null引用。如果在代码之前检查null,它将停止抛出异常。
if (eventType != null && eventType.SelectedItem.Text == "Big Party")
{
DoSomeWork(); //should be changing values or visible options on the page
}
当然这不会让你想要你。
你从哪里调用Workflow.openPage?很可能,您在页面生命周期中过早地调用它并且尚未创建控件。
答案 2 :(得分:0)
我的猜测是你在页面上有一个名为eventType的控件,但是它位于一个命名容器中,而你的FindControl方法并没有找到它。
因此eventType为null,因此null.SelectedItem引发空引用异常。
如果您正在使用母版页,并且您正在寻找子页面上的控件,那么情况肯定是这样的。你需要做的是检索实现INamingContainer的适当控件,通常是一个ContentPlaceHolder
ContentPlaceHolder namingContainer = Page.PreviousPage.Controls(0).FindControl("ContentPlaceHolder1");
并查看您正在寻找的控件。
DropDownList eventType = namingContainer.FindControl("eventType");
这是一篇关于命名容器的介绍文章,以及如何在具有多个命名容器的页面上使用FindControls。
http://aspadvice.com/blogs/joteke/archive/2006/08/12/20546.aspx