2009-06-16 51 views
3

我試圖找到一個用戶控件(ASCX)的aspx頁面上的標籤查找ASPX控制說aspx頁面。顯然Page.FindControl( 「lablel1」)是行不通的。我需要在某處添加ClientID嗎?謝謝。從ASCX

+1

我假設你的問題(你使用「lablel1」)的錯字不是你的問題的來源? – 2009-06-16 19:35:49

+0

你假設正確 – halp 2009-06-16 19:37:18

回答

14

我想你應該停下來思考一下你的設計。你不控制應該永遠需要了解包含它們的頁面任何東西 - 事實上,你需要去找到網頁上的控制區域內另一個控制告訴我,你應該重新考慮這個問題。

我可以告訴你的最好的事情(用我對你的架構知之甚少)就是你應該傳遞一個你希望在你的用戶控件中找到的控件的引用。這樣你的控制就不必知道關於它自身以外的事情。

+1

也許,但那不是問題。在這種情況下,有一個頁面有一個「錯誤/狀態標籤」,其值由頁面上的任何用戶控件設置。它曾經被索引靜態訪問,現在我試圖改變它使用某種FindControl。 – halp 2009-06-16 19:33:26

3

當使用FindControl()的外側的控制的直接父的背景下,您將需要步行控制樹找哪個級別的label生活,並在適當的級別調用.FindControl()

這就是說,採取@Andrew野兔的建議,重新審視你的架構。有可能是一個更好的辦法讓你的用戶控件與它的消費互動的情況。例如,您可以在UserControl中公開一個公共事件,並將一個事件處理程序添加到您的消費頁面(或基本頁面/母版頁)。當創建一個事件時,你可以做出你想要的簽名,所以繼續,幷包含需要通過的錯誤文本。

如果你想得到它的時髦,你可以把你的錯誤標籤變成一個自定義控件與鉤入事件。

樣本事件:

Public Event UserErrorOccured(ByVal ErrorText as String) 

樣本誤差:

If Not Page.IsValid Then 
    RaiseEvent("The page is not valid") 
End If 

樣品處理器:如果層次是可以預見的

protected sub UserEventHandler(ByVal ErrorText as String) Handles MyUserControl.UserErrorOccured 
    errorLabel.Text = ErrorText 
End Sub 
2

這樣的事情應該工作。

Me.Owner.FindControl("controlName") 

或...

Me.Owner.Parent.FindControl("controlName") 

或...

Me.Owner.Parent.Parent.FindControl("controlName") 

如果它是不可預測的,那麼你就必須寫一個遞歸(昂貴的)函數查找改爲控制。儘管如此,請謹慎使用此方法,因爲如果在大型頁面上過度使用,此類算法會變得緩慢且笨拙。

下面是VB的例子,通過樹(從孩子父母)搜索倒着,並找到控制:

Protected Function FindControlByID(ByRef childControl As Control, ByVal ID As String) As Control 
    Dim ctrl As Control = childControl.FindControl(ID) 
    If Not ctrl Is Nothing Then 
     Return ctrl 
    Else 
     If Not childControl.Parent Is Nothing Then 
     Return FindControlByID(childControl.Parent, ID) 
     Else 
     Return Nothing 
     End If 
    End If 
    End Function 

我這樣稱呼它:

Dim lbl As Label = FindControlByID(Me.Owner, "label1") 
1

從內用戶控制

Me.NamingContainer.FindControl("label1") 
0

想到其他一些想法。 Page類中有「Items」集合,可用於存儲值或Session對象,以實現類似的想法。另一個是在頁面上公開一個公共方法來更新標籤。該架構可能存在AJAX問題,因爲我不確定回調可以同時更新頁面的多個區域,所以這只是一個警告,我並不是說我有這個問題。

TheSteve的答案也是有效的,當我不得不在過去的時候,雖然它可能是棘手的混亂控制。儘管如此,我也會對安德魯的第二個回答。

2

創建的接口,如:

public interface IStatusDisplayer 
{ 
    Label StatusLabel { get; } 
} 

實現顯示的錯誤/狀態標籤頁​​面上的接口。如果您的用戶控件需要訪問的標籤,你可以這樣做:

var statusDisplayer = this.Page as IStatusDisplayer; 
if (statusDisplayer != null) 
{ 
    statusDisplayer.StatusLabel.Text = "Hello World!"; 
} 
1
Control ct = WebUserControl11.FindControl("DropDownList1"); 

DropDownList dt = (DropDownList)ct; 

TextBox1.Text = dt.SelectedValue.ToString(); 
0

這很簡單,首先你需要訪問母版頁的ContentPlaceHolder:

Dim ContentPlaceHolder1 As ContentPlaceHolder = TryCast(Page.Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder) 

然後,使用的ContentPlaceHolder你現在可以在aspx頁面上找到控件的ID:

TryCast(ContentPlaceHolder1.FindControl("LiteralOnParentASPXPage"), Literal).Text = "some text" 
0

這是一個蠻力會面HOD,但它工作時的控制是在控件的教主深埋:

private Control GetTextEditor(ControlCollection controls) 
{ 
    foreach (Control ctrl in controls) 
    { 
     if (ctrl.ID != null && ctrl.ID == "teMessage") 
      return ctrl; 
     if (ctrl.Controls.Count > 0) 
     { 
      Control inner = GetTextEditor(ctrl.Controls); 
      if (inner != null) 
       return inner; 
     } 
    } 
    return null; 
} 
0

的接入裝置在.aspx文件中啓用/禁用控制來自的.ascx,試試這個代碼,它也是解決方案。

protected void Page_Load(object sender, EventArgs e) 
{ 
    Control ct = PEM.FindControl("btnInsert"); 
    Button btn = (Button)ct; 
    btn.Enabled = false; 
}