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

时间:2010-11-21 16:21:43

标签: c# asp.net

我在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);
    }
}

5 个答案:

答案 0 :(得分:2)

FindControl仅搜索对象的容器(在您的情况下为页面)。但是您要查找的按钮包含在页面包含的面板中。

您需要进行递归搜索才能找到它。

答案 1 :(得分:1)

你尝试做什么? YourPanelName.FindControl()

答案 2 :(得分:1)

我喜欢使用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; 
} 

答案 3 :(得分:0)

这是一个老线程,但它是一个顶级搜索结果,所以值得在这里写一些注释供其他人查找:

x.FindControl搜索所有具有x作为命名容器的控件。 这意味着如果您在Panel中有一个Control,FindControl会找到它。 FindControl不仅限于查找x.Controls中列出的匹配ID的控件。您可以将FindControl视为有效地执行递归搜索,而不是在子级(或子级的子级)控件中查看INamingContainers。

INamingContainers是使用其内容作为模板在其中创建零个,一个或多个控件副本的控件。例如中继器等

因此,如果你在Repeater中有一个控件,那么Page.FindControl将找不到它。上面的递归函数,使用Page作为根,将从转发器模板中找到该控件的第一个实例。如果你知道你只有一个中继器,那么确定,去吧(但你也可以在转发器控件上开始递归搜索,而不是在整个页面上)

当您想要引用位于不是页面的命名容器内的控件时,最好从事件的“发送者”获取引用,例如你追求的控制的OnLoad。如果您的“发件人”是命名容器(转发器模板),那么您可以使用它上的FindControl向下移动到您所追求的控件。

如果没有涉及转发器,那么原始海报可能实际上只是拼写错误(控制在ASCX文件中不称为btn_clear)。需要看标记。在这种情况下,这可能是他们从未跟进的原因,但是其他认为FindControl无法在Panel中找到控件的人可能会找到这个页面,这就是我发布这个后续行动的原因。

答案 4 :(得分:0)

添加runat ="服务器"到那个特定元素