我想要的是什么:
在一个理想的场景中,我将能够创建一个具有oncommand
和commandargument
属性的锚点,但是如果我没有弄错,那么它不起作用并且您必须创建一个控件,例如作为一个按钮,它将在哪里工作。我的问题来自于想要为页面上的每个项目放置该按钮,因为我需要添加控件的东西,但是如果我创建了一个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);
答案 0 :(得分:0)
很难说出你想要的是什么,但我会尽我所能尽可能接近。首先,你需要一些控制来作为“容器”。这可以是你喜欢的任何控制。在我对这种情况的测试中,我做了类似的事情:
<div runat="server" id="ContainerDiv"></div>
接下来你需要一种管理你身份的方法。我通过创建一个简单的变量和方法来做到这一点:
private int IdCount = 0;
private string GetNewID()
{
return string.Format("try{0}", IdCount++);
}
现在你说你想要一个也有CommandName
和CommandArgument
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",
});
}
}