1

我想要什么:

在理想情况下,我将能够创建一个带有oncommandcommandargument属性的锚点,但如果我没记错的话,那是行不通的,您必须创建一个控件,例如一个按钮,它将在其中工作。然后我的问题来自想要为页面上的每个项目放置该按钮,因为我需要一些东西来添加控件,但是如果我创建了一个锚点runat="server",比如说,id="try"我不能这样做:try.Controls.Add(button)因为锚点' try' 实际上还没有被创建。

背景:

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

我努力了:

创建锚点(或其他)并定位id这些元素,然后创建一个按钮,如下所示,但是,由于元素是通过编程方式添加的,并且所需的数量会有所不同,因此ids 将是 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);
4

1 回答 1

0

很难说你的目的是什么,但我会尽我所能接近。首先,您需要一些控制才能作为“容器”工作。这几乎可以是您喜欢的任何控件。在我对这种情况的测试中,我做了这样的事情:

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

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

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

现在你说你想要一个也有 aCommandNameCommandArgumenta的 achor 标签LinkButton来做这件事。您可以LinkButton像这样在上面的 div 中添加一个:

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

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

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

更新

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

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",
            });
    }    
}
于 2013-08-02T16:04:32.280 回答