在Postback之后,DataList的ASP.NET / DataItem为null

时间:2010-08-20 13:57:01

标签: asp.net null postback datalist dataitem

在我的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;
    }

3 个答案:

答案 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(和其他控件)清空。