每次在Button Click事件上添加用户控件

时间:2010-05-13 20:33:18

标签: asp.net user-controls viewstate

我想在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);
}        

3 个答案:

答案 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;
    }
}