【问题标题】:Dynamic added controls and AJAX动态添加控件和 AJAX
【发布时间】:2009-03-06 13:31:45
【问题描述】:

首先让我指出,这不是一个容易回答的问题。至少它几乎不可能找到答案。

在 UpdatePanel 中,我将一些控件动态添加到我的面板控件中。

List<Showing> showings = cBLL.GetShowings(tenant.Id);

        int j = 1;
        foreach(Showing showing in showings)
        {
            UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
            uc.ID = "showing_" + j;
            uc.Visible = true;
            ((BookShowing)uc).SetShowing(showing);
            pnl_showings.Controls.Add(uc);
            j++;
        }

这一切都发生在从控件异步触发的按钮事件中。

在上面显示的代码中添加的这些字段下方有一个按钮。该按钮也放置在更新面板中。这个按钮叫做:btn_editShowings

现在当我来到 btn_editShowings_Click 事件处理程序时,我的动态添加控件不再存在。我也尝试在 OnInit 中捕获它们,但它们也不存在。

F...怎么可能从动态添加的控件中获取数据??? 无论如何,我不在乎它的性能有多糟糕或其他什么,来解决这个问题?

更新:

我现在尝试执行以下操作,这应该在我读到的 LoadViewState 之前触发 Init 时起作用。

我在 Button 事件中添加了一些动态控件

    protected void Button2_Click(object sender, EventArgs e)
    {    
         for (int i = j; i < showno + 4; i++)
                {
                    UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
                    uc.ID = "showing_" + i;
                    uc.Attributes.Add("runat", "Server");
                    uc.EnableViewState = true;
                    uc.Visible = true;
                    pnl_showings.Controls.Add(uc);
                }
          UpdatePanel1.Update();
    }

我在我的 init 函数中做了同样的事情: 受保护的覆盖无效 OnInit(EventArgs e) { base.OnInit(e);

        if (Session["ShowingsCount"] != null)
        {
            int noOfUCs = (int)Session["ShowingsCount"];
            for (int i = 1; i < noOfUCs; i++)
            {
                UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
                uc.ID = "showing_" + i;
                uc.Attributes.Add("runat", "Server");
                uc.EnableViewState = true;
                uc.Visible = true;
                pnl_showings.Controls.Add(uc);
            }
            UpdatePanel1.Update();
        }
    }

但是当我尝试这个时:

FindControl("showing_1").Visible = false;

我得到一个空引用异常。

最好的问候 真正的 Napster,再次陷入困境。

【问题讨论】:

    标签: asp.net ajax


    【解决方案1】:
    1. 首次添加控件时,请跟踪需要在视图状态中重新创建的控件数量。
    2. 在此之后的每次回发时,请确保在 LoadViewState 方法中使用相同 ID 将相应数量的控件添加回页面。

    关键是您必须在每次回发时向页面添加动态创建的控件,并且您必须在加载视图状态之前执行此操作,以便控件将其表单发布的值加载回其中。

    【讨论】:

    • 我从来没有进入过LoadViewState方法,怎么回事?我必须做任何特别的事情来引发那个事件吗?
    【解决方案2】:
    BookShowing bs = (BookShowing)UpdatePanel1.FindControl("showing_" + i);
    

    解决方案是,OnInit 覆盖确实有效,是我以错误的方式获取用户控件。

    关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多