【问题标题】:Control Add PostBack Problem控制添加回发问题
【发布时间】:2010-01-11 14:03:50
【问题描述】:

我动态添加控件但是; easc 回发事件我的控件不见了。我再也看不到我的控件了。

那么我该如何添加控制?

【问题讨论】:

  • 例如,如何在 CreateChildControls 事件上添加控件?你能提供一些示例代码吗?
  • 控制 _obj = LoadControl("HaberObje.ascx"); String _Link = _row["link"].ToString(); String _Resim = "resim.png"; ((HaberObje)_obj).SetInfo(_row["baslik"].ToString) pnlHaber.Controls.Add(_obj); // 这里我添加了控件但是当回发执行时我丢失了所有包含的控件

标签: asp.net controls postback add


【解决方案1】:

因为您必须在每次回发时重新创建控件, see this article

【讨论】:

  • 好的,我可以保留在 ViewState 博客中吗?我想当我添加一个控件时,每个回发都必须在那里。如果我重新创建所有控件,我将丢失控件的信息和用户键入的其他信息(例如控件中的文本框)。那么解决办法是什么?
【解决方案2】:

在页面的 Init 事件中添加控件,它们将在回发时保留在视图状态中。确保他们有一个唯一的 ID。

查看此链接...

ASP.NET Add Control on postback

一个非常简单的例子..

public partial class MyPage : Page
{
    TextBox tb;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        tb = new TextBox();
        tb.ID = "testtb";
        Page.Form.Controls.Add(tb);
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //tb.Text will have whatever text the user entered upon postback
    }
}

【讨论】:

    【解决方案3】:

    在加载控件后,您应该始终在其 ID 属性中为 UserControl 分配一个唯一的 ID。而且您应该始终在回发时重新创建 UserControl。

    要保留回发数据(即 TextBox'es),您必须在调用 base.LoadViewState 后在覆盖的 LoadViewState 方法中加载 UserControl - 在处理回发数据之前。

    【讨论】:

    • 好的,但是我可以保留在 ViewState 博客中吗?我想当我添加一个控件时,每个回发都必须在那里。如果我重新创建所有控件,我将丢失控件的信息和用户键入的其他信息(例如控件中的文本框)。那么解决办法是什么?
    【解决方案4】:

    在运行时添加控件并在回发时保存:

    int NumberOfControls = 0;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState["b1"] = 0;
        }
        else
        {
            if ((int)ViewState["b1"] > 0)
            {
                CreateBtn();
    
            }
        }
    }
    
    
    protected void btn1_Click(object sender, EventArgs e)
    {
        NumberOfControls = (int)ViewState["b1"];
    
        Button b1 = new Button();
       // b1.Attributes.Add("onclick", "x()");
        b1.Text = "test2";
    
        b1.ID = "b1_" + ++NumberOfControls;
        b1.Click +=new  System.EventHandler(btn11);
        Panel1.Controls.Add(b1);
        ViewState["b1"] = NumberOfControls;
    }
    
    protected void CreateBtn()
    {
        for (int i = 0; i < (int)ViewState["b1"];i++)
        {
            Button b1 = new Button();
            // b1.Attributes.Add("onclick", "x()");
            b1.Text = "test2";
            b1.ID = "b1_" + i;
            b1.Click += new System.EventHandler(btn11);
            Panel1.Controls.Add(b1);
        }
    }
    
    protected void btn11(object sender, System.EventArgs e)
    {
        Response.Redirect("AboutUs.aspx");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2011-01-22
      相关资源
      最近更新 更多