在我的ASP.NET表单中回发后(单击一个按钮),我的表单的所有DataItem都为null。为什么?即使在回发后,我该怎么做才能检索DataList的内容?
protected void buttonAddRecord_Click(object sender, EventArgs e)
{
foreach (DataListItem item in listFields.Items)
{
// item.DataItem == null WTF?
}
}
protected void Page_Load(object sender, EventArgs e)
{
BindFields();
}
private void BindFields()
{
object setting = MySettings.GetSetting();
if (!Null.IsNull(setting))
{
listFields.DataSource =
DataProvider.GetData(int.Parse(setting.ToString()));
listFields.DataBind();
}
listFields.Visible = listFields.Items.Count > 0;
emptyMessage.Visible = listFields.Items.Count == 0;
}
答案 0 :(得分:9)
找到我的答案here。
John说的是数据源项 仅在数据绑定时才可用。 他们不再可以访问了 初始加载。
您可能会考虑使用对象或 对象集合代表 您使用更新的屏幕数据 网格,然后坚持改变 到数据库。
更确切地说,我使用HiddenField在帖子中存储ID,我从数据库请求数据,而不是试图从DataItem中获取数据(不能在数据绑定事件之外使用)。强>
HiddenField控件用于 存储需要的值 持续跨帖子到服务器。
答案 1 :(得分:7)
DataItem
仅在数据绑定时可用。
Load
出现在Click
之前,因此您无论如何都会覆盖您的数据。
这样做:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindFields();
}
}
您应该使用DataSource(如ObjectDataSource)来处理DataBinding和Update / Insert。
更新/建议:
使用PlaceHolders将数据绑定到您自己遇到麻烦。您应该考虑使用ListView,GridView,DataList或Repeater。我相信其中任何一个都可以做你想要的,你必须少编程。利用你的时间来学习它们,而不是试图让它发挥作用,它注定要失败。
答案 2 :(得分:1)
在每次回发后检查DataBind()是否真的是DataList。通常,当你不再绑定它们时,你会在PostBack之后将DataList,GridView,DropDownList(和其他控件)清空。