为什么以下代码不起作用?我正在创建一个控件,添加一个子控件并尝试使用.FindControl方法通过id检索它。
[Test]
public void TryToFindControl()
{
var myPanel = new Panel();
var textField = new TextBox
{
ID = "mycontrol"
};
myPanel.Controls.Add(textField);
var foundControl = myPanel.FindControl("mycontrol");
// this fails
Assert.IsNotNull(foundControl);
}
答案 0 :(得分:2)
面板尚未添加到页面,因此您无法使用 FindControl 。相反,您需要在 Panel.Controls
中找到它[TestMethod]
public void TryToFindControl()
{
var myPanel = new Panel();
var textField = new TextBox
{
ID = "mycontrol"
};
myPanel.Controls.Add(textField);
var foundControl = myPanel.Controls
.OfType<TextBox>()
.FirstOrDefault(x => x.ID == "mycontrol");
Assert.IsNotNull(foundControl);
}
FindControl 仅在容器添加到Page时才有效。
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var myPanel = new Panel();
var textField = new TextBox
{
ID = "mycontrol"
};
myPanel.Controls.Add(textField);
Controls.Add(myPanel);
// foundControl is not null anymore!
var foundControl = myPanel.FindControl("mycontrol");
}
}
答案 1 :(得分:1)
控件必须是要找到的服务器端Page
控件集合层次结构的一部分。
public void TryToFindControl()
{
var myPanel = new Panel();
// key line here
Page.Controls.Add(myPanel);
var textField = new TextBox
{
ID = "mycontrol"
};
myPanel.Controls.Add(textField);
var foundControl = myPanel.FindControl("mycontrol");
Assert.IsNotNull(foundControl);
}
答案 2 :(得分:0)
首先,我将从System.UI.Control开始形成我不知道的事实,而不是System.Web.UI.Control
然后我找不到TextField
控件,所以我使用了网络TextBox
。请根据需要调整您的代码。我还使用了VS Test属性
[TestMethod()]
public void TryToFindControl()
{
var editContainer = new HtmlTableCell();
editContainer.Controls.Add(new TextBox
{
ID = "mycontrol",
});
System.Web.UI.Control foundControl = null;
foreach (System.Web.UI.Control ctrl in editContainer.Controls)
{
if (ctrl.ID == "mycontrol")
{
foundControl = ctrl;
break;
}
}
// This works
Assert.IsNotNull(foundControl);
}
根据您的确切措辞,如果您想要访问您添加的控件,请首先创建一个实例作为变量,以便您可以直接访问它。请记住,我不知道你想要在全球范围内实现什么,所以我的答案可能不适用于此,或者可能有更好的解决方案。
[TestMethod()]
public void TryToFindControl()
{
var editContainer = new HtmlTableCell();
var foundControl = new TextBox
{
ID = "mycontrol"
};
editContainer.Controls.Add(foundControl);
// This works
Assert.IsNotNull(foundControl);
}