将asp控件添加到以编程方式添加的内容中

本文关键字:添加 方式 asp 控件 编程 | 更新日期: 2023-09-27 18:26:24

我想要什么:

在理想的情况下,我可以创建一个具有oncommandcommandargument属性的锚点,但如果我没有错的话,这是不起作用的,你必须创建一个控件,比如按钮,它将在哪里起作用。然后,我的问题就来了,我想为页面上的每个项目放置这个按钮,因为我需要一些东西来添加控件,但如果我用runat="server"id="try"创建了一个锚,那么我就做不到:try.Controls.Add(button),因为锚"try"实际上还没有创建。

背景:

大多数内容都是以编程方式添加的。字符串生成器用于创建将在页面上显示的html的字符串。是否可以将控件添加到该字符串中间的页面?OR到以这种方式编程添加的元素中?

我试过:

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

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

所以我尝试了以下的变体,在我的aspx页面中,我有一个带有id="try"的"dummy"元素,所以它不会抱怨,但我理解它为什么不喜欢它,同时我不知道如何绕过它。

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

将asp控件添加到以编程方式添加的内容中

很难说你想要什么,但我会尽我所能接近。第一件事是你需要一些控制来作为一个"容器"工作。这可以是你喜欢的任何控制。在这个场景的测试中,我做了这样的事情:

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

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

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

现在你说你想要一个也有CommandNameCommandArgument的achor标签,LinkButton会这样做。您可以在上面的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",
            });
    }    
}