C# 为什么我的ListView在回发时会丢失数据?
我相信这有一个非常简单的解释,但我已经把头发扯得太长了,所以为了我的理智,我呼吁这么做 这很简单:我有一个C# 为什么我的ListView在回发时会丢失数据?,c#,asp.net,webforms,C#,Asp.net,Webforms,我相信这有一个非常简单的解释,但我已经把头发扯得太长了,所以为了我的理智,我呼吁这么做 这很简单:我有一个ListView,当页面第一次加载时绑定它(并且在回发时不)。它是表单的一部分。第一次加载时,我看到了项目列表,但回发时,我看到了EmptyDataTemplate。这是正确的行为吗?我确信ListView作为一个数据绑定控件应该在回发过程中保持其列表。以下是代码,第一个前端: <asp:ListView ID="boxes" runat="server" ItemType="Mode
ListView
,当页面第一次加载时绑定它(并且在回发时不)。它是表单的一部分。第一次加载时,我看到了项目列表,但回发时,我看到了EmptyDataTemplate
。这是正确的行为吗?我确信ListView
作为一个数据绑定控件应该在回发过程中保持其列表。以下是代码,第一个前端:
<asp:ListView ID="boxes" runat="server" ItemType="Model.Generic.ILookupEntity<int>" EnableViewState="true">
<LayoutTemplate>
<div>
<ul class="contact-list checkbox-row">
<li id="itemPlaceholder" runat="server" />
</ul>
</div>
</LayoutTemplate>
<ItemTemplate>
<li>
<label>
<asp:CheckBox ID="cb" runat="server" />
<asp:HiddenField ID="value" runat="server" Value="<%# Item.Key %>" />
<span><%# Item.Value %></span>
</label>
</li>
</ItemTemplate>
<EmptyDataTemplate>
<p>No data</p>
</EmptyDataTemplate>
</asp:ListView>
<asp:CheckBoxList ID="boxtemp" runat="server" />
更新2
在确认这不是预期的行为后,我现在找到了我认为的原因。
ListView
位于用户控件内,该控件正在PreRender
上调用this.DataBind()
。我认为这会导致内部所有数据绑定控件在回发时重新绑定。奇怪的是,如果我处理ListView
的OnDataBinding
和ondatabind
事件,在回发时,我可以观察到在这两个事件期间列表仍然包含4项。但仍呈现为显示EmptyDataTemplate
。在这种情况下,假设需要父控件的DataBind
调用,有人能建议最佳解决方案吗?您熟悉回发吗?你能读到的就是回发行为。。如果是回发,你的else在哪里?是的,非常熟悉,这就是我不理解这种行为的原因。ListView应该将其数据保留在post back上,对吗?没有'else',因为我不想在发回时做任何事情(除了处理单击事件时提交)。您可以将受保护的对象设置为静态,或者将对象存储为会话变量,并将其转换为(ListView)会话[“YourVariable”]
抱歉,我不明白这有什么帮助。我想问的是为什么ListView不在回发中保留其绑定项。您使用的是OnInit,当ViewState尚未初始化时,会在前面调用此方法。使用OnLoad有什么问题吗?
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!IsPostBack)
{
var items = new List<Model.Generic.LookupEntity<int>>()
{
new Model.Generic.LookupEntity<int>(1, "One"),
new Model.Generic.LookupEntity<int>(2, "Two"),
new Model.Generic.LookupEntity<int>(3, "Three"),
new Model.Generic.LookupEntity<int>(4, "Four"),
};
boxes.DataSource = items;
boxes.DataBind();
boxtemp.DataSource = items;
boxtemp.DataTextField = "Value";
boxtemp.DataValueField = "Key";
boxtemp.DataBind();
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
var test = boxes.Items.Count;
}