我正在尝试动态添加控件
代码:
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"> 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>"));
}
}
在下图中如果我点击添加更多签证按钮我想获得另一个签证详情
有什么想法吗?提前致谢
答案 0 :(得分:13)
我将展示一个您可以按自己的方式尝试的示例
一个想法是创建一个按钮列表,您可以在其中存储您在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页面生命周期。
您在服务器上的按钮点击事件是PostBackEvent
,您应该可以使用在Load或Init事件中使用的相同方法调用CreateMyButton()
。
答案 1 :(得分:1)
如果删除静态'i'变量并使用hidenInput来维护创建的控件(或会话值),则可以。
但我建议您阅读以下文章,以找到创建动态控件的更好方法:
答案 2 :(得分: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>"));
}