添加asp控件以编程方式添加内容

时间:2013-08-02 15:19:17

标签: c# asp.net

我想要的是什么:

在一个理想的场景中,我将能够创建一个具有oncommandcommandargument属性的锚点,但是如果我没有弄错,那么它不起作用并且您必须创建一个控件,例如作为一个按钮,它将在哪里工作。我的问题来自于想要为页面上的每个项目放置该按钮,因为我需要添加控件的东西,但是如果我创建了一个runat="server"的锚点,比如id="try",我然后不能这样做:try.Controls.Add(button)因为锚'尝试'还没有真正创建。

背景:

大多数内容都是以编程方式添加的。 stringbuilder用于创建将在页面上显示的html字符串。是否可以在此字符串的中间向页面添加控件?或者以这种方式以编程方式添加的元素?

我试过了:

创建锚点(或其他方式)并定位这些元素的id,然后按如下方式创建按钮,但是,因为元素是以编程方式添加的,所需的数量会有所不同,id s然后是try0,try1等:

var button = new Button {
  CommandArgument = "test",
  Text = "Try"
};
button.Command += bt_sendMail_tryDevice_Click;
try.Controls.Add(button);

所以我尝试了下面的变体,在我的aspx页面中,我有一个带有id="try"的'虚拟'元素,所以它没有抱怨,但我理解为什么它不喜欢它,在同时虽然我不知道怎么绕过它。 (tryCount是一个int,随着每次迭代而增加,以保持id唯一)。

this.FindControl(try.ToString() + tryCount.ToString()).Controls.Add(button);

1 个答案:

答案 0 :(得分:0)

很难说出你想要的是什么,但我会尽我所能尽可能接近。首先,你需要一些控制来作为“容器”。这可以是你喜欢的任何控制。在我对这种情况的测试中,我做了类似的事情:

<div runat="server" id="ContainerDiv"></div>

接下来你需要一种管理你身份的方法。我通过创建一个简单的变量和方法来做到这一点:

private int IdCount = 0;
private string GetNewID()
{
    return string.Format("try{0}", IdCount++);
}

现在你说你想要一个也有CommandNameCommandArgument LinkButton的achor标签就可以了。您可以在上面的div中添加LinkButton,如下所示:

ContainerDiv.Controls.Add(
    new LinkButton()
    {
        ID = GetNewID(),
        CommandName = "DoSomething",
        CommandArgument = "arg",
        Text= "Try Me",
    });

显然用你真正想要的值替换CommandName和其他值。请务必在分配ID时致电GetNewID(),以便它们始终是唯一的。

控件可以作为现有服务器控件的子项添加到页面中,包括页面本身,但这样做可能会非常棘手。请务必尽快将它们添加到您的页面(在页面生命周期中),因为回发事件可能无法正常工作。

<强>更新

在页面上保留对已创建元素的引用可以简化您的实现:

public partial class _Default : Page
{
    Control containerDiv;

    protected void Page_Load(object sender, EventArgs e)
    {
         this.containerDiv = SomeMethodThatCreatesADiv();
         this.Page.Controls.Add(containerDiv);
    }

    void SomeOtherMethod()
    {
        this.containerDiv.Controls.Add(
            new LinkButton()
            {
                ID = GetNewID(),
                CommandName = "DoSomething",
                CommandArgument = "arg",
                Text= "Try Me",
            });
    }    
}