簡體   English   中英

如何找到放置在面板內的控件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM