10

在我的 ASP.NET 表单中回发(单击按钮)后,我的表单的所有 DataItem 都是空的。为什么?即使在回发之后,我应该怎么做才能检索 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;
    }
4

3 回答 3

9

在这里找到我的答案。

正如 John 所说,数据源项仅在数据绑定时可用。它们在初始加载后不再可访问。

您可能会考虑使用一个对象或对象集合来表示您使用网格更新的屏幕数据,然后将更改从该数据持久保存到数据库中。

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

HiddenField控件用于存储需要跨帖子持久保存到服务器的值。

于 2010-08-20T15:58:28.197 回答
6

DataItem仅在数据绑定时可用。

Load出现在前面,Click所以无论如何你都在覆盖你的数据。

做这个:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindFields();
    }
}

您应该使用 DataSource(如 ObjectDataSource)来处理 DataBinding 和更新/插入。

更新/建议:

使用 PlaceHolders 将数据绑定到您会遇到麻烦。您应该考虑使用 ListView、GridView、DataList 或 Repeater。我敢肯定,其中任何一个都可以满足您的要求,并且您将不得不减少编程。花时间学习它们,而不是试图让它发挥作用,它注定会失败。

于 2010-08-20T14:12:11.687 回答
0

在每次回发后检查您是否真的 DataBind() DataList。通常,当您不再绑定 DataList、GridView、DropDownList(和其他控件)后,您会在 PostBack 之后将它们变为空。

于 2010-08-20T14:08:28.570 回答