我在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);
}
}
答案 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 ="服务器"到那个特定元素