在运行时确定用户控制参数

时间:2010-10-26 17:30:09

标签: asp.net

我有一个用户控件,我这样称呼:

<MyNamespace:MyControl runAt="server" ID="foo" />

有什么办法可以在运行时确定ID参数并将其传入?

5 个答案:

答案 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 />
        <%
    }
%>