繁体   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