【问题标题】:ASP.NET / DataItem of DataList is null after Postback回发后 DataList 的 ASP.NET / DataItem 为空
【发布时间】:2011-04-01 16:26:56
【问题描述】:

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

【问题讨论】:

    标签: asp.net null postback datalist dataitem


    【解决方案1】:

    找到我的答案here

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

    您可能会考虑拥有一个对象或 对象集合表示 更新的屏幕数据 网格,然后从那个持久化更改 到数据库。

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

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

    【讨论】:

    • 好吧,我没有看到任何其他选择。到目前为止,它运行良好。
    • HiddenField 为我工作。我正在使用中继器,需要将数据从绑定到按钮点击中持久化。
    • 这听起来像是一种根据需要进行两倍的数据库调用的好方法。似乎 DataList 的模型可能很差。
    • 该链接已过期。
    【解决方案2】:

    DataItem 仅在数据绑定时可用。

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

    这样做:

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

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

    更新/建议:

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

    【讨论】:

    • 我已经在使用 DataList(查看标题)。而且我不得不使用 PlaceHolder,因为我无法提前知道每个字段的 Control 类型。实际上,我的 DataList 的每个 DataListItem 都包含一个 PlaceHolder 控件,该控件将在数据绑定时确定。
    • 那么你在这些占位符中放了什么?
    • 每个占位符包含一个控件,例如TextBox、CheckBox、RadioButtonList、DropDownList等。由于它是动态的,我无法知道确切的控件类型。每个占位符代表表单中的一个字段,例如姓名、地址、电子邮件、喜欢的食物等。
    • 您必须在回发时添加它们,但不要放入数据。在绑定函数中添加一个布尔参数,回发时将其设置为 false。如果为真,则添加控件+数据,如果为假,则仅添加控件并在单击时提取数据。
    • 这行不通,因为回发时无法访问 DataItem。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的提示,但即使在回发时我也确实重新绑定了 DataList。我还检查了调试器,数据源在回发时绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多