我有一个用户控件,我这样称呼:
<MyNamespace:MyControl runAt="server" ID="foo" />
有什么办法可以在运行时确定ID参数并将其传入?
答案 0 :(得分:1)
这非常简单;只要它构造正确(例如,使用 LoadControl 用于 UserControls )并且足够早进行生命周期初始化,您可以随意分配ID并使用相应 NamingContainer 上的 FindControl 。
这是一个基本样本:
protected override void CreateChildControls()
{
for (int i = 0; i < 5; i++)
Controls.Add(new Literal() { ID = "MyControl" + i, Text = i.ToString() });
base.CreateChildControls();
}
protected override void OnPreRender(EventArgs e)
{
for (int i = 0; i < 5; i++)
Response.Write(((Literal)FindControl("MyControl" + i)).Text + "<br/>");
}
...输出:
0
1
2
3
4
01234
答案 1 :(得分:0)
我发现的最佳策略是设置控件的OnInit回调,并使用codebehind来设置属性值。
当然,如果你在模板环境中,那就是另一个故事。
修改强>
抱歉,我读得太快,并没有意识到您正在尝试设置ID属性本身。 ID属性的要点是在其父控件的上下文中唯一标识该控件的特定实例。无论您想通过将此ID设置为某个自定义值来实现什么,都可以使用其他策略更好地完成。您能否提供有关您正试图解决的更大问题的更多信息?
答案 2 :(得分:0)
如果您想以编程方式执行此操作,请在代码后面动态添加控件。
答案 3 :(得分:0)
对于它的价值,这是我最终使用的解决方案:
<% Dim ctrlName As String %>
....
<% ctrlId = "whatever" 'need to wait until here to figure out the ID %>
....
<% mySpan.Controls.Add(New MyNamespace.MyControl() _
With { .ID = ctrlId }) %>
<span runat="server" id="mySpan" />
修改强>
这不会在循环中起作用...请参阅我的更好的答案,即使在循环中也能正常工作。
答案 4 :(得分:0)
这是一种即使在循环中也能运作的技术!
<script runat="server">
void AddTextBox(int i)
{
var ctrl = new TextBox() { ID = i.ToString()};
ctrl.RenderControl(new HtmlTextWriter(Response.Output));
}
</script>
<%
for (var i = 0; i < 5; i++)
{
%>
Control Rendering Begin
<br />
<%
AddTextBox(i);
%>
<br />
Control Rendering Ends
<br />
<%
}
%>