回发后 DataList 的 ASP.NET / DataItem 为空
Posted
技术标签:
【中文标题】回发后 DataList 的 ASP.NET / DataItem 为空【英文标题】:ASP.NET / DataItem of DataList is null after Postback 【发布时间】: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;
【问题讨论】:
【参考方案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。我还检查了调试器,数据源在回发时绑定。以上是关于回发后 DataList 的 ASP.NET / DataItem 为空的主要内容,如果未能解决你的问题,请参考以下文章
回发后,我的 JavaScript 函数在 ASP.NET 中不起作用
回发后 F5 的 asp.net 问题,因为它做了它应该做的事情
Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件,导致发生错误。