我試圖找到一個用戶控件(ASCX)的aspx頁面上的標籤查找ASPX控制說aspx頁面。顯然Page.FindControl( 「lablel1」)是行不通的。我需要在某處添加ClientID嗎?謝謝。從ASCX
從ASCX
回答
我想你應該停下來思考一下你的設計。你不控制應該永遠需要了解包含它們的頁面任何東西 - 事實上,你需要去找到網頁上的控制區域內另一個控制告訴我,你應該重新考慮這個問題。
我可以告訴你的最好的事情(用我對你的架構知之甚少)就是你應該傳遞一個你希望在你的用戶控件中找到的控件的引用。這樣你的控制就不必知道關於它自身以外的事情。
也許,但那不是問題。在這種情況下,有一個頁面有一個「錯誤/狀態標籤」,其值由頁面上的任何用戶控件設置。它曾經被索引靜態訪問,現在我試圖改變它使用某種FindControl。 – halp 2009-06-16 19:33:26
當使用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
這樣的事情應該工作。
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")
從內用戶控制
Me.NamingContainer.FindControl("label1")
想到其他一些想法。 Page類中有「Items」集合,可用於存儲值或Session對象,以實現類似的想法。另一個是在頁面上公開一個公共方法來更新標籤。該架構可能存在AJAX問題,因爲我不確定回調可以同時更新頁面的多個區域,所以這只是一個警告,我並不是說我有這個問題。
TheSteve的答案也是有效的,當我不得不在過去的時候,雖然它可能是棘手的混亂控制。儘管如此,我也會對安德魯的第二個回答。
創建的接口,如:
public interface IStatusDisplayer
{
Label StatusLabel { get; }
}
實現顯示的錯誤/狀態標籤頁面上的接口。如果您的用戶控件需要訪問的標籤,你可以這樣做:
var statusDisplayer = this.Page as IStatusDisplayer;
if (statusDisplayer != null)
{
statusDisplayer.StatusLabel.Text = "Hello World!";
}
Control ct = WebUserControl11.FindControl("DropDownList1");
DropDownList dt = (DropDownList)ct;
TextBox1.Text = dt.SelectedValue.ToString();
這很簡單,首先你需要訪問母版頁的ContentPlaceHolder:
Dim ContentPlaceHolder1 As ContentPlaceHolder = TryCast(Page.Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder)
然後,使用的ContentPlaceHolder你現在可以在aspx頁面上找到控件的ID:
TryCast(ContentPlaceHolder1.FindControl("LiteralOnParentASPXPage"), Literal).Text = "some text"
這是一個蠻力會面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;
}
的接入裝置在.aspx文件中啓用/禁用控制來自的.ascx,試試這個代碼,它也是解決方案。
protected void Page_Load(object sender, EventArgs e)
{
Control ct = PEM.FindControl("btnInsert");
Button btn = (Button)ct;
btn.Enabled = false;
}
- 1. 從ascx調用Javascript函數
- 2. 從.ascx引用.aspx屬性
- 3. 從JavaScript調用.ascx函數也是在.ascx
- 4. 從代碼隱藏添加ascx時,ascx中的控件爲空
- 5. 如何在另一個.ascx中從.ascx獲取變量?
- 6. 刷新或添加從另一個ascx控制ascx控制
- 7. 如何從父ASPX從其子ASCX
- 8. 內ASCX
- 9. 從字符串加載.ascx(SQL)
- 10. 從ascx控制訪問母版頁
- 11. 訪問.aspx頁面Ajax TabContainer從.aspx .ascx
- 12. 從ascx文件訪問UserControl屬性
- 13. 從Azure Blob存儲使用ascx文件
- 14. 將jquery事件從aspx傳遞到ascx
- 15. 從ASCX內部獲取UserControl ControlID
- 16. 從.ASPX通過ID動態引用.ASCX
- 17. JSON推送不工作從ascx
- 18. 如何調用從.ascx文件
- 19. 從ascx代碼隱藏的asp控制
- 20. 使用代理從ASPX更新ASCX
- 21. 從按鈕點擊刷新ascx
- 22. 從.ascx動態加載ListView模板
- 23. 從aspx javascript傳遞值到ascx頁面
- 24. 從ASP.Net中的ascx頁抓取控件
- 25. 從ASCX控件調用ASPX方法
- 26. 從cs發送一個列表到ascx
- 27. 獲取從包含相同的ascx
- 28. 如何將數據從ASCX javascript發佈到相同的ascx控件?
- 29. aspx include vs ascx
- 30. ASCX文件
我假設你的問題(你使用「lablel1」)的錯字不是你的問題的來源? – 2009-06-16 19:35:49
你假設正確 – halp 2009-06-16 19:37:18