Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的ListView在回发时会丢失数据?_C#_Asp.net_Webforms - Fatal编程技术网

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;
    }