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

asm*_*smo 10 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;
    }
Run Code Online (Sandbox Code Playgroud)

asm*_*smo 9

在这里找到我的答案.

约翰说,数据源项只有在数据绑定时才可用.初始加载后,它们不再可访问.

您可以考虑让对象或对象集合表示您使用网格更新的屏幕数据,然后将更改从该更新持久保存到数据库.

更准确地说,我使用HiddenField在帖子中存储ID,我从数据库请求数据,而不是试图从DataItem中获取数据(不能在数据绑定事件之外使用).

HiddenField控件用于存储需要跨越的帖子被保存到服务器的值.


Jer*_*oen 7

DataItem 仅在数据绑定时可用.

Load之前Click是你所以你要覆盖你的数据.

做这个:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindFields();
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该使用DataSource(如ObjectDataSource)来处理DataBinding和Update/Insert.

更新/建议:

使用PlaceHolders将数据绑定到您遇到麻烦.您应该考虑使用ListView,GridView,DataList或Repeater.我相信其中任何一个都可以做你想要的,你必须减少编程.利用你的时间来学习它们,而不是试图让它发挥作用,它注定要失败.