将asp控件添加到以编程方式添加的内容中
本文关键字:添加 方式 asp 控件 编程 | 更新日期: 2023-09-27 18:26:24
我想要什么:
在理想的情况下,我可以创建一个具有oncommand
和commandargument
属性的锚点,但如果我没有错的话,这是不起作用的,你必须创建一个控件,比如按钮,它将在哪里起作用。然后,我的问题就来了,我想为页面上的每个项目放置这个按钮,因为我需要一些东西来添加控件,但如果我用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);
很难说你想要什么,但我会尽我所能接近。第一件事是你需要一些控制来作为一个"容器"工作。这可以是你喜欢的任何控制。在这个场景的测试中,我做了这样的事情:
<div runat="server" id="ContainerDiv"></div>
下一件事是你需要一种方法来管理你的Id。我通过创建一个简单的变量和方法来做到这一点:
private int IdCount = 0;
private string GetNewID()
{
return string.Format("try{0}", IdCount++);
}
现在你说你想要一个也有CommandName
和CommandArgument
的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",
});
}
}