我希望有人能就我在这里犯错的地方提供一些建议。我试图动态添加一系列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);
}
}
非常感谢任何协助。
答案 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);
}
}