代码之家  ›  专栏  ›  技术社区  ›  Tim Meers

从类内部访问控件

  •  0
  • Tim Meers  · 技术社区  · 17 年前

    我不确定我在哪里失败,但代码如下:

    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 回复  |  直到 17 年前
        1
  •  1
  •   Joel Coehoorn    17 年前

    看起来真像 page.FindControl() 他回来了 null . 不管怎样,那将是我第一个去看的地方。请确保键入的控件名称正确,并且在调用此方法时,该控件在生命周期的某一点存在于页面上。

        2
  •  1
  •   Erik Funkenbusch    17 年前

    您获得“对象引用未设置为对象实例”的原因是FindControl返回null,并且您正在尝试取消对null引用的引用。如果在代码之前检查null,它将停止抛出异常。

    if (eventType != null && eventType.SelectedItem.Text == "Big Party")
    {
        DoSomeWork(); //should be changing values or visible options on the page    
    }
    

    当然,这不会给你想要的东西。

    您从何处调用Workflow.openPage?更有可能的是,您在页面生命周期的早期调用它,而控件尚未创建。

        3
  •  0
  •   Matthew Vines    17 年前

    因此eventType为null,因此null.SelectedItem引发null引用异常。

    如果您使用的是母版页,并且您正在子页上寻找控件,那么情况肯定是这样。您需要做的是检索实现InAdminContainer的适当控件,通常是ContentPlaceHolder

    ContentPlaceHolder namingContainer = Page.PreviousPage.Controls(0).FindControl("ContentPlaceHolder1");
    

    DropDownList eventType = namingContainer.FindControl("eventType");
    

    这是一篇介绍命名容器的文章,以及如何在具有多个命名容器的页面上查找控件。

    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

    推荐文章