我试图创建应用程序动态添加控件。我有主页,我的asp:内容在这里:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server">
</asp:ScriptManager>
<div style="margin: 10px">
<asp:UpdatePanel ID="updatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="myPlaceHolder" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
<asp:Button ID="btnAdd" runat="server" Text="Add" />
在btnAdd中单击后,我想添加两个文本框。我试图像http://jagdeepmankotia.wordpress.com/2010/01/30/dynamically-add-controls-in-asp-net-c/中那样
这是我的代码:
static int myCount = 1;
private TextBox[] color;
private TextBox[] text;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
color = new TextBox[myCount];
text = new TextBox[myCount];
for (int i = 0; i < myCount; i++)
{
TextBox tbColor = new TextBox();
tbColor.ID = "colorTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbColor);
color[i] = tbColor;
TextBox tbText = new TextBox();
tbText.ID = "textTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbText);
text[i] = tbText;
LiteralControl literalBreak = new LiteralControl("<br />");
myPlaceHolder.Controls.Add(literalBreak);
}
}
public Control GetPostBackControl(Page page)
{
Control control = null;
string ctrlname = page.Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = page.FindControl(ctrlname);
}
else
{
foreach (string ctl in page.Request.Form)
{
Control mycontrol = page.FindControl(ctl);
if (mycontrol is System.Web.UI.WebControls.Button)
{
control = mycontrol;
// This gives you ID of which button caused postback
break;
}
}
}
return control;
}
protected void Page_PreInit(object sender, EventArgs e)
{
Control myControl = GetPostBackControl(this.Page);
if (myControl != null)
if (myControl.ClientID.ToString() == "btnAdd")
myCount = myCount + 1;
}
protected void btnAdd_Click(object sender, EventArgs e)
{
//handled in PreInit
}
当在函数foreach的getPostBackControl()中查找我的btnAdd时,例如在ctr“ ctl00 $ MainContent $ scriptManager1”的第一次迭代中,myControl为null ...在以后的迭代中,...我的函数总是返回null。可能是什么原因?
最佳答案
FindControl
仅搜索容器的直接子代。由于您是从页面级别开始的,因此您将需要通过子UpdatePanel
控件进行递归才能到达btnAdd
控件。
请查看here作为示例,了解如何执行此操作。
编辑:
我不确定我是否理解您为什么以这种方式“寻找”按钮,因为屏幕上只有一个静态按钮-在这种情况下您无需使用FindControl
。
<asp:Button ID="btnAdd" runat="server" Text="Add" onclick="btnAdd_Click" />
(或在代码中,
btnAdd.OnClick += new EventHandler(btnAdd_Click);
)即使您在窗体中动态添加了多个Button,也可以将所有这些Button连接到同一个Button Click处理程序,在这种情况下,
sender
将包含被单击的Button控件。通常,您将使用FindControl从动态添加的Input控件(文本框等)中抓取数据,而不是查看哪个控件导致了回发(因为在适当的事件处理程序中使用“发送者”会更容易)编辑2:
您可以像其他控件一样动态添加按钮
Button myButton = new Button();
myButton.Text = "Click Me";
myButton.Click += new EventHandler(btnAdd_Click);
myPlaceHolder.Controls.Add(myButton);
如果要使所有已添加的控件在回发之间“停留”,请在页面和控件上启用viewstate,然后确保在OnInit中仅添加一次控件而不进行回发:
base.OnInit(e);
if (!IsPostBack)
{ // ... Add controls here
您可以将“ mycount”的状态保留在一个隐藏字段中(在同一更新面板中,并启用viewstate)-您每次都需要将其解析为一个int。或者,您可以使用SessionState对其进行跟踪。