2012-08-29 30 views
0

我試圖在我的頁面上實現查找控件,查找ID爲「w1test」的文本框,但是我不斷收到一個錯誤,指出「對象引用不是設置爲一個對象的實例。「不過,我覺得一切都是爲了...查找控制 - 對象引用未設置爲對象實例

這裏是我的代碼:

Private Sub getTextbox() 
    Try 
     Dim txtbox As TextBox = CType(Page.FindControl("w1test"), TextBox) 
     txtbox.Text = "UPDATED" 
    Catch ex As Exception 
    End Try 
End Sub 

在此先感謝。

+2

你能顯示aspx頁面代碼嗎? –

+0

witest存在於aspx頁面,還是動態生成的控件? –

+0

不,它不是動態生成的,並且有一個ID爲w1test的文本框: Rexxo

回答

2

您需要FindControl的遞歸版本。事情是這樣的

Public Function RecursiveFindControl(container As Control, name as String) as Control 
    If Not(container.ID Is Nothing) AndAlso (container.ID.Equals(name)) Then 
     Return container 
    End If 

    For Each c as Control in container.Controls 
     Dim ctrl as Control = RecursiveFindControl(c, name) 
     If Not ctrl Is Nothing Then 
      return ctrl 
     End If 
    Next 
    return Nothing 
End Function 

呼叫與

Dim txtbox As TextBox = CType(RecursiveFindControl(Page, "w1test"), TextBox) 
+0

這樣做了,我猜它需要遞歸,因爲母版頁?非常感謝您的幫助:) – Rexxo

+1

您需要遞歸,因爲FindControl只搜索頁面的即時或頂級容器。它不會遞歸搜索命名容器中包含的容器的控件。可能您的控件不會直接包含在頁面中,而是包含在頁面的「子」容器中。所以你需要搜索每個控件並檢查它是否包含子控件等等。請注意,如果頁面上有很多控件,則在性能方面這種遞歸可能會非常昂貴。 – Steve

0

以下爲我工作。如果我需要迭代控件(例如TextBox0,TextBox1等),我只需從這些控件之一獲取NamingContainer,並使用「父級」控件執行其他控件的搜索,如下所示。

// get NamingContainer from one of the controls 
Control parent = TextBox0.NamingContainer; 
// now can iterate through controls 
for(int i = 0; i < someBound; i++) 
{ 
    ((TextBox)parent.FindControl("TextBox" + i)).Text = "Text here now"; 
} 
相關問題