保持动态添加DropDownList的状态c#

时间:2015-03-28 12:50:13

标签: c# asp.net

我希望有人能就我在这里犯错的地方提供一些建议。我试图动态添加一系列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);

        }
}

非常感谢任何协助。

1 个答案:

答案 0 :(得分:0)

我现在已经开始工作了,并且希望在有助于其他人的情况下发布答案。 @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);

        }
    }