【问题标题】:Maintain State of Dynamically Added DropDownList c#维护动态添加的 DropDownList c# 的状态
【发布时间】:2015-03-28 12:50:12
【问题描述】:

我希望有人可以就我在这里做错了什么提供一些建议。我正在尝试动态添加一系列将从数据库中填充的 DropDownList 控件。我在设计时添加了许多其他 DropDownLists,这些 DropDownLists 从数据库中填充并在回发中维护状态。

我只是遇到动态添加控件的问题。问题是 DropDown 控件在最初创建时从数据库中填充,并且在回发时返回空。 (我已将 DropDownList 控件的 autopostback 设置为 true,以便在所选项目更改时进行回发。)

我已经阅读了许多帖子并尝试了各种策略,但到目前为止没有任何效果。

以下是相关代码:

我有一个占位符可以将控件附加到。

<asp:PlaceHolder ID="DynamicControlsHolder" runat="server" />

我使用会话变量来保存控件的数量(对于我的测试,我只添加 1,但需要添加几个)

public int NumberOfControls
{
get { return (int)ViewState["NumControls"]; }
set { ViewState["NumControls"] = value; }
}

根据是否是回发,我调用了两种不同的方法。

if (!IsPostBack)
{
    this.NumberOfControls = 0;
    addSomeControls();
}
else
{
    this.createControls();
}

protected void addSomeControls()    //done in original page_load so bind data
{

    DropDownList dl = new DropDownList();
    //not using the following event handler yet, so I didn't post the code
    dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange);

    using (I.DBEntities1 ctx = new I.IDBEntities1())
    {

      dl.EnableViewState = true;
      dl.AutoPostBack = true;
      dl.ID = "ControlID_" + NumberOfControls.ToString();
      dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type);
      dl.DataValueField = "ID";
      dl.DataTextField = "Assoc_Type";
      dl.DataBind();
    }

    DynamicControlsHolder.Controls.Add(dl);
    this.NumberOfControls++;
}

protected void createControls()   //postback
{
        int count = this.NumberOfControls;

        for (int i = 0; i < count; i++)
        {

            DropDownList dl = new DropDownList();

            dl.ID = "ControlID_" + NumberOfControls.ToString();

            DynamicControlsHolder.Controls.Add(dl);

        }
}

任何帮助将不胜感激。

【问题讨论】:

  • 我正在动态创建这些控件。所以,我的理解是它们在回发后不再存在。
  • 这个问题被回答了很多次here is one wanswer。如何从动态添加的控件中维护和获取 vvaleus。
  • andricadar,它 DynamicControlsHolder.FindControl("ControlID_" + NumberOfControls.ToString()) 在回发时返回 null。
  • @adricadar,感谢您的帮助。我为 IsPostback 添加了 createControls() 到 OnInit,我得到了 NumberOfControls 会话变量的 nullReferenceException。
  • @adricdar,我将 NumberOfControls 转换为 Session 并消除了 nullReferenceException。我将 createControls() 移至 OnInit PostBack,不幸的是,我在回发时仍然得到一个空列表。

标签: c# asp.net


【解决方案1】:

我现在有一些工作,并想发布答案以防万一这将有助于其他人。 @dricdar,感谢您的帮助。您的反馈有助于解决问题。

我将对 createControls() 的调用移至 OnInit。 我将 NumberOfControls 更改为会话变量:

public int NumberOfControls
{
  get { return (int)Session["NumControls"]; }
  set { Session["NumControls"] = value; }
}

在 OnInit 的 onPostBack 中,我调用 createControls()。 在 Page_Load, !isPostBack 中,我将 NumberOfControls 设置为零并调用 addSomeControls();

方法现在如下所示;

protected void addSomeControls()    //done in original page_load so bind data
    {
        DropDownList dl = new DropDownList();
        dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange);

        dl.EnableViewState = true;
        dl.AutoPostBack = true;
        this.NumberOfControls++;
        dl.ID = "ControlID_" + this.NumberOfControls.ToString();

        using (I.DBEntities1 ctx = new I.DBEntities1())
        {
            dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type);
            dl.DataValueField = "ID";
            dl.DataTextField = "Assoc_Type";
            dl.DataBind();
        }

        DynamicControlsHolder.Controls.Add(dl);
        DynamicControlsHolder.EnableViewState = true;

    }


    protected void createControls()   //postback, rely upon viewstate here
    {
        int count = this.NumberOfControls;

        for (int i = 0; i < count; i++)
        {

            DropDownList dl = new DropDownList();
            dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange);
            dl.AutoPostBack = true;

        using (I.DBEntities1 ctx = new I.DBEntities1())
        {

            dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type);
            dl.DataValueField = "ID";
            dl.DataTextField = "Assoc_Type";
            dl.DataBind();

        }

        dl.ID = "ControlID_" + NumberOfControls.ToString();

        DynamicControlsHolder.Controls.Add(dl);

        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多