[英]How do I find a control I placed inside a panel?
我在Panel中有一個按鈕。 我正在嘗試找到按鈕的ID,但我的代碼不起作用:
protected void pnl_nocutomer_Load(object sender, EventArgs e)
{
Button btn;
btn = this.FindControl("btn_clear") as Button;
Page.LoadComplete += new EventHandler(Page_LoadComplete);
string LanguageID = Globals.GetSuitableLanguage(Page);
if (LanguageID == "ar")
{
btn.Text = Globals.Translate("Ok", LanguageID);
}
}
FindControl僅搜索對象的容器(在您的情況下為頁面)。 但是您要查找的按鈕包含在頁面包含的面板中。
您需要進行遞歸搜索才能找到它。
你嘗試做一個YourPanelName.FindControl()
怎么樣?
我喜歡使用CoddingHorror上的函數。 只需將您的面板作為根和您正在尋找的控件的ID。 像之前的回答一樣,這個使用遞歸來查找您正在尋找的控件。 使用此代碼。
button btn = (Button)FindControlRecursive(pnl_nocustomer, "btn_clear");
private Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
{
return root;
}
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, id);
if (t != null)
{
return t;
}
}
return null;
}
這是一個老線程,但它是一個頂級的搜索結果,所以值得在這里寫一些注釋供其他人查找:
x.FindControl搜索所有具有x作為命名容器的控件。 這意味着如果你在Panel中有一個Control,FindControl會找到它。 FindControl不僅限於查找x.Controls中列出的匹配ID的控件。 您可以將FindControl視為有效地執行遞歸搜索,而不是在子級(或子級子級)控件中查看INamingContainers。
INamingContainers是使用其內容作為模板在其中創建零個,一個或多個控件副本的控件。 例如中繼器等
因此,如果你在Repeater中有一個控件,那么Page.FindControl將找不到它。 上面的遞歸函數,使用Page作為根,將從轉發器模板中找到該控件的第一個實例。 如果你知道你只有一個中繼器,那么確定,去吧(但你也可以在轉發器控件上開始遞歸搜索,而不是在整個頁面上)
當您想要引用位於不是頁面的命名容器內的控件時,最好從事件的“發送者”獲取引用,例如您所使用的控件的OnLoad。 如果您的“發件人”是命名容器(轉發器模板),那么您可以使用它上的FindControl向下移動到您所在的控件。
如果沒有涉及轉發器,那么原始海報可能實際上只是拼寫錯誤(控制在ASCX文件中不稱為btn_clear)。 需要看標記。 在這種情況下,這可能是他們從未跟進的原因,但是其他認為FindControl無法在Panel中找到控件的人可能會找到這個頁面,這就是我發布這個后續行動的原因。
將runat =“server”添加到該特定元素
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.