从类中访问控件

时间:2009-09-02 15:25:34

标签: c# asp.net

我正在尝试从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")
  有什么想法吗?

3 个答案:

答案 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

http://visualstudiomagazine.com/articles/2008/05/14/using-findcontrol-and-previouspage-with-master-pages.aspx