如何在ASP.NET中点击按钮时动态添加控件?

7

我正在尝试动态添加控件

代码:

AddVisaControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddVisaControl.ascx.cs" EnableViewState="false" Inherits="Pyramid.AddVisaControl" %>
<%@ Register assembly="BasicFrame.WebControls.BasicDatePicker" namespace="BasicFrame.WebControls" tagprefix="BDP" %>
<div id="divreg" runat="server">
<table id="tbl" runat="server">
<tr>
  <td class="style8"> Visa Number:</td>
  <td class="style20"><asp:TextBox ID="txtUser" Width="160px" runat="server"/></td>
  <td class="style22"> Country Name:</td>
  <td class="style23">
<asp:DropDownList ID="dropCountry" Width="165px" runat="server">
</asp:DropDownList></td>
</tr>
 <tr>
 <td class="style22"> Type of Visa:</td>
 <td class="style23">
<asp:DropDownList ID="dropVisa" Width="165px" runat="server"> </asp:DropDownList></td>
<td class="style22"> Type of Entry:</td>
<td class="style23">
<asp:DropDownList ID="dropEntry" Width="165px" runat="server"> </asp:DropDownList></td>
</tr>
<tr>
<td class="style8">&nbsp; Expiry Date</td>
<td class="style20">
</td>
</tr>
</table>

.cs 代码:

以下代码是问题所在,当我第一次单击添加按钮时,它会正确地添加控件,但如果我关闭浏览器窗口再次打开并单击添加按钮,我会得到更多的控件。

   static int i = 0;
    protected void addnewtext_Click(object sender, EventArgs e)
    {
        i++;
        for (int j = 0; j <= i; j++)
        {
            AddVisaControl ac = (AddVisaControl)Page.LoadControl("AddVisaControl.ascx");
            PlaceHolder1.Controls.Add(ac);
            PlaceHolder1.Controls.Add(new LiteralControl("<BR>"));
        }
    }

在下面的图片中,如果我点击“添加更多签证”按钮,我想要获取另一个签证的详细信息。有什么想法吗?提前感谢。

自然地,您已经将整数变量“i”保持为静态的。 - Rameez Ahmed Sayad
点击“添加”按钮肯定会根据您的代码逻辑添加更多控件。那么您到底在寻找什么?“添加”按钮不应该添加更多控件吗? - R.C
那确实是问题所在,那么该如何解决呢? - user2500094
如果我添加了两次,然后关闭浏览器,再次打开并添加控件,那么它会添加更多的控件,即之前添加的控件。 - user2500094
3个回答

10

我将展示一个例子,你可以用自己的方法尝试

一个想法是创建一个按钮列表,其中存储你在btnCreateDynamic_Click中创建的按钮。

你可以像下面这样编写一个方法:

private Button CreateButton(string id, string name)
        {
            Button b = new Button();
            b.Text = name;
            b.ID = id;
            b.Click += new EventHandler(Button_Click);
            b.OnClientClick = "ButtonClick('" + b.ClientID + "')";
            return b;
        }

btnCreateDynamic_click 中,你可以有类似以下的内容:
Button b = CreateButton("dinamicBtn"+myDinamicButtonsList.Count.ToString(),"dinamicBtn"+myDinamicButtonsList.Count.ToString());
myDinamicButtonsList.add(b);
and in the pageLoad for example you could do something like

foreach(button btn in myDinamicButtonsList){
    form1.Controls.Add(btn));
}

List<Button> myDinamicButtonsList = new List<Button>();

myDinamicButtonsList(我的动态按钮列表) 应该存储在某个地方,以便在每个请求后都可以检索到它。

编辑:在页面加载中,您可以使用以下内容:

if(Session["myDinamicButtons"] == null){
    List<Button> myDinamicButtonsList = new List<Button>();
    Session["myDinamicButtons"] = myDinamicButtonsList;
}

foreach(Button btn in Session["myDinamicButtons"] as List<Button>){
    form1.Controls.Add(btn));
}

我没有测试过,但它应该可以工作。

另外,提供一些信息可能会更有帮助...

在客户端,您的按钮单击事件将引起页面回发,从而启动ASP.Net页面生命周期。 enter image description here

服务器上的按钮单击事件是一个PostBackEvent,您应该能够使用与Load或Init事件中使用的相同方法调用CreateMyButton()


1
如果您删除静态的“i”变量,并使用一个hidenInput来维护已创建控件的数量(或会话值),那么您将没有问题。
但我建议您阅读以下文章,找到更好的创建动态控件的方法: ASP.NET中的动态控件创建

0

移除 static int i = 0;

将方法更改为以下内容

  protected void addnewtext_Click(object sender, EventArgs e)
    {     

            AddVisaControl ac = (AddVisaControl)Page.LoadControl("AddVisaControl.ascx");
            PlaceHolder1.Controls.Add(ac);
            PlaceHolder1.Controls.Add(new LiteralControl("<BR>"));

    }

如果我这样使用,控件会被覆盖。 - user2500094
你使用了很多CSS样式,所以某些元素的表现是绝对的(如边距、内边距等),不确定。但它们必须是相对的。 - Rameez Ahmed Sayad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接