【发布时间】: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,不幸的是,我在回发时仍然得到一个空列表。