2013-08-02 40 views
1

我想什么:添加ASP控件以编程方式添加的内容

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

背景:

大多数内容都以编程方式添加。一个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是一个随着每次迭代而增加以保持id唯一的int)。

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

'ASP:PlaceHolder'是专为这种使用情况。在控件添加到它之前不会呈现(通常以编程方式)。 –

+0

但我无法以编程方式添加占位符吗?我目前在一个固定的位置使用了一个占位符,但在这里我需要另一个占位符,用于页面上的每一行。 – dudledok

+0

你是指“页面上的每一行”是什么意思?你有网格视图吗?中继?你可以添加一个'LinkBut​​ton'到项目模板吗? – Jay

回答

0

它有点难以告诉你要做什么,但我会尽我所能去尽可能地接近我。首先,你需要一些控制来作为“容器”工作。这可以是任何你喜欢的控制。在我测试这种情况下,我做了这样的事情:

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

接下来你需要一种方法来管理你的ID。我这样做是通过创建一个简单的变量和方法,像这样:

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

现在你说你想要一个阿克尔标记,也有CommandNameCommandArgument一个LinkButton会做到这一点。您可以在上面这样的LinkButton添加到您的div:

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", 
      }); 
    }  
} 
+0

这实际上正是我一直在尝试,但我的问题是我不能瞄准的是编程的id的元素,即我想要从后面的代码创建按钮的div,因此我可以不要定位该div的id(尽管它在技术上是在它被定位之前创建的,但intellisense不知道) – dudledok

+0

尝试保留对该div的引用,而不是通过ID查找它。我会更新我的回答 – Jay

+0

这里发生了什么? 'this.containerDiv = SomeMethodThatCreatesADiv();'+'this.Page.Controls.Add(containerDiv);' – dudledok

相关问题