2009-09-02 108 views
0

我試圖從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

如果您在VSS中運行調試並將eventType.SelectedItem.Text放入監視列表中,該監視列表中顯示的變量的值是什麼? – gsirianni

+0

如果您想顯示頁面的.aspx標記源,您嘗試從中找到控件,我認爲這將很容易診斷。 –

+0

@Mthethew - 頁面長度超過2600行(不在代碼後面)。我不認爲我可以,或者想發佈那麼多。但我會看到有關它的一些內容,並張貼需要的東西。 @gsirianni - 我會試着看看我能做些什麼。 –

回答

1

你的原因「對象引用不設置到對象的實例。」是因爲FindControl返回null,並且您試圖刪除空引用。如果你在代碼之前檢查null,它將停止拋出異常。

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

當然,這不會讓你想你想找的。

你在哪裏調用Workflow.openPage?更可能的是,您在頁面生命週期中過早調用它,並且該控件尚未創建。

+0

對錢的權利。我實際上是基於gsirianni的評論而得出的。該控件確實有一個值,但在我調用此代碼時並未填充該值。給你答案,因爲你給了更多的細節,雖然喬爾的答案也是正確的。 –

1

它肯定看起來像page.FindControl()返回null。無論如何,這將是我首先看的地方。確保正確輸入控件名稱,並且在調用此方法時,控件在生命週期中的頁面上存在。

+0

如果不是這種情況,那麼可能是沒有選擇項目,在這種情況下'SelectedItem'將是'null' –

+0

@Daniel是的,它已經選擇了一個項目。 @Joel這個名字是正確的,據我所知可以從VS和當我查看源代碼。 –

0

我的猜測是你在頁面上有一個名爲eventType的控件,但它在一個命名容器中,並且你的FindControl方法沒有爲此找到它。

因此eventType爲null,所以null.SelectedItem引發空引用異常。

如果您使用母版頁,並且您正在尋找子頁面上的控件,那麼這當然是這種情況。你將需要做的是檢索適當的控制實現作INamingContainer,通常的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

+0

它只是在表單標籤下。 –

+0

這也不在主頁/內容頁面中。只是一個普通的酒吧形式。 –

+0

實現INamingContainer的控件比ContentPlaceHolders更多。但是你可以確保我吠叫錯誤的樹。控件有一個名爲NamingContainer的屬性。我會確保「eventType」的命名容器實際上是您認爲的頁面。這將不得不從它的實際頁面來檢查,而不是在你的App_Code類中,因爲它仍然返回null。 –