表单视图在PostBack时的DataItem为空

4
我正在使用带有分页功能的 LinqDataSource 和 FormView 在 ASP.NET 页面上进行开发。我正在尝试在 PageLoad 上访问 FormView 的 DataItem 属性,在第一页加载时没有问题,但是一旦我使用 FormView 上的 Next/Prev 分页按钮(导致 postback),即使在 FormView 中显示了记录,DataItem 属性也将为空。为什么第一页加载时它可以正常工作,而 postback 后不能呢?
如果您好奇我的 PageLoad 事件是什么样子的,请看这里:
protected void Page_Load(object sender, EventArgs e)
{
    Label lbl = (Label)fvData.FindControl("AREALabel");
    if (fvData.DataItem != null && lbl != null)
    {
        INSTRUMENT_LOOP_DESCRIPTION record = (INSTRUMENT_LOOP_DESCRIPTION)fvData.DataItem;
        var area = db.AREAs.SingleOrDefault(q => q.AREA1 == record.AREA);
        if (area != null)
            lbl.Text = area.AREA_NAME;
    }
}

可能需要在Page_IndexChanging事件中重新绑定您的FormView。 - Waqar Janjua
如果它使用我在页面上放置的 LinqDataSource 控件中的数据,那么该如何重新绑定它?我已经在 FormView 和 LinqDataSource 上都调用了 DataBind(),但似乎都没有起作用。 - Hoff
2个回答

5

你绑定到任何数据绑定控件的对象不会在页面的ViewState中持久存储

因此,在后续的提交中,除非重新绑定控件,否则DataItem属性将为null

当控件被绑定时,此属性将包含对该对象的引用。

通常情况下,如果你想要在对象被绑定时执行某些操作,那么你需要访问这个属性,所以你需要对DataBound事件做出反应

例:

输出

enter image description here

代码后台

protected void ds_DataBound(object sender, EventArgs e)
{
    var d = this.fv.DataItem as employee;
    this.lbl.Text = d.lname;
}

ASPX

    <asp:LinqDataSource ID="lds" runat="server"
        ContextTypeName="DataClassesDataContext"
        TableName="employees" 
    >

    </asp:LinqDataSource>
    <asp:FormView runat="server" ID="fv" DataSourceID="lds" AllowPaging="true" 
        OnDataBound="ds_DataBound">
        <ItemTemplate>
            <asp:TextBox Text='<%# Bind("fname") %>' runat="server" ID="txt" />
        </ItemTemplate>
    </asp:FormView>
    <br />
    <asp:Label ID="lbl" runat="server" />

运行得非常好。使用“DataBound”事件而不是“PageLoad”事件解决了问题。谢谢! - Hoff

0

您的数据不会在 PostBack 上保留。您需要在 PageIndexChanging 事件中重新绑定 FormView,例如:

protected void FormView_PageIndexChanging(object sender, FormViewPageEventArgs e)
{
    FormView.PageIndex = e.NewPageIndex;
    //rebind your data here
}

我只是在页面上使用了LinqDataSource控件,如何强制它重新绑定数据?分页似乎工作正常,我已经在FormView和LinqDataSource上调用了DataBind(),但都没有起作用。 - Hoff
你需要将你的 FormView 进行数据绑定。也许可以尝试在 FormView 中加入 'EnableViewstate="true"'? - gws2
EnableViewState默认为true。非常奇怪的行为,因为当我翻页时,我可以清楚地看到表单视图中的数据,但是我无法访问DataItem :( - Hoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接