我想在button_click事件上每次添加一个UserControl实例,它只是第一次工作。
我通过附加ViewState中的整数为用户控件添加ID。
为什么它不会为后续点击添加工作。
这是具有相同行为的简化版本。
protected void Button1_Click(object sender, EventArgs e)
{
HtmlButton btnClick = new HtmlButton();
btnClick.ID = "bt" + Append.ToString();
btnClick.InnerText = "Button 1";
MainArea.Controls.Add(btnClick);
}
答案 0 :(得分:0)
好的,现在代码已发布,我可以确认问题。
每次单击该按钮,都会进行回发。在回发时,您添加新按钮,其名称包含您的计数。但是,当页面在第二个按钮单击时重新渲染时,它会丢失您添加的所有控件,只需添加一个(从此回发的按钮单击)。
所以你要做的就是建立一个循环,比如:
protected void Button1_Click(object sender, EventArgs e) {
for(int i = 0; i < Append; i++)
{
HtmlButton btnClick = new HtmlButton();
btnClick.ID = "bt" + i.ToString();
btnClick.InnerText = "Button " + i;
MainArea.Controls.Add(btnClick);
}
}
这将在每次点击时添加一个按钮,假设“追加”是您在视图状态中存储的某种计数器。
现在,假设您想要每次点击一个控件实例。这就是我想你说的。
答案 1 :(得分:0)
我正在使用地址用户控件做类似的事情。
由于您是动态添加控件,因此需要在每次回发后重新创建控件(每次添加另一个时,都需要重新创建以前添加的所有控件)。
我保留了控件ID的arraylist(如果你希望viewstate保留内容,你需要创建具有相同ID的控件),这也跟踪我之前添加并需要重新创建的控件数量。然后我在页面加载事件中循环并再次创建控件:
foreach (string id in AddressItemIDs)
{
addAddressControl(null, id);
}
然后我的“button1_click”事件(在我的情况下,我正在使用链接按钮......
protected void LinkButton1_Click(object sender, EventArgs e)
{
if (AddressCount == 0 || AddressCount < MaxAddresses && ((addressItem)addressContainer.Controls[addressContainer.Controls.Count-1]).HasAddress)
{
int i = 0;
string prefix = "addressItem_";
while (AddressItemIDs.Contains(prefix + i)) i++;
AddressCount++;
addAddressControl(null, prefix + i);
}
Button1.Visible = (AddressCount < MaxAddresses);
}
这是我的addAddressControl方法:
protected void addAddressControl(Address address, string id)
{
addressItem ai = (addressItem)LoadControl("~/controls/addressItem.ascx");
ai.RemoveClicked += new EventHandler(ai_RemoveClicked);
ai.ID = id;
if (address != null)
{
ai.AddressID = address.AddressID;
ai.Address = address.Street;
ai.City = address.City;
ai.State = address.State;
ai.Zip = address.Zip;
ai.TypeID = address.TypeID;
}
if(!AddressItemIDs.Contains(id))
AddressItemIDs.Add(id);
addressContainer.Controls.Add(ai);
}
答案 2 :(得分:0)
public partial class _Default : Page
{
public int n;
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["Controls"] != null)
n = (int)ViewState["Controls"];
if (!Page.IsPostBack)
n = 0;
for (int i = 0; i <= n; i++)
{
TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
uc.ID = "TestControl" + i.ToString();
PlaceHolder1.Controls.Add(uc);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
uc.ID = "TestControl" + n++.ToString();
PlaceHolder1.Controls.Add(uc);
ViewState["Controls"] = n;
}
}