FormView数据源在另一个窗体视图中单击按钮时丢失

时间:2014-12-22 20:17:30

标签: c# asp.net data-binding formview

我想通过说我是asp.net的初学者来开头,特别是在使用FormView控件时。我经过长时间的努力搜索,花了好几个小时来调试这个问题。

我在一个aspx页面上有3个FormViews。每个FormView都有自己的EditItemTemplatePagerTemplate以及DefaultMode="Edit"。我没有使用SqlDataSource,而是在PageLoad时以编程方式对if(!Page.IsPostBack)进行数据绑定,并在调用PageIndexChanging方法时调用数据绑定方法。寻呼机模板包含分别设置为CommandArgument="Prev"CommandArgument="Next"的“后退”和“下一步”按钮,并且都设置为CommandName="Page"

分页在第一个FormView上效果很好。当我点击后面或下一个按钮时,它会适当地页面(即重新绑定)。在第一个FormView的分页事件期间,我还成功调用了第二个和第三个FormView的绑定方法,因为我希望它们绑定特定于第一个{{1}中所选页面的数据}}。

但是,当我回到第一个FormView的第一页(即FormView),然后尝试在第二个PageIndex = 0中向前翻页时,第一个数据键FormView为空。实际上,当我尝试点击第二个FormView上的导航按钮时,formview1.DataSource对于第一个FormView为空。

然后,这里我认为这很奇怪,...如果我在第一次FormView再次点击回来,那么FormView很好,然后我可以在第二次导航formview1.DataSource

表单视图和按钮的所有视图状态都设置为true。 在尝试任何分页之前,我曾尝试在FormView的分页事件中调用formview1.DataBind(),但没有成功。我还尝试在分页按钮上设置属性:formview2UseSubmitBehavior="False"。不可否认,我在没有真正了解行为的情况下做到了这一点,而是在看到它在其他有些相关问题的解决方案中建议之后实施。

模板很长,因为每个模板都有很多字段。但CausesValidation="False"代码如下所示:

FormView

PagerTemplates:

<asp:FormView ID="fvHeader" runat="server" DataKeyNames="ObjectID" DefaultMode="Edit" AllowPaging="True" OnModeChanging="fvHeader_ModeChanging" OnPageIndexChanging= "fvHeader_PageIndexChanging"> 
<EditItemTemplate> ..... </EditItemTemplate> </asp:FormView>

请注意,在我的问题中,“ <PagerSettings Mode="NextPrevious" /> <PagerTemplate> <span class="labels">Page: <%#fvHeader.PageIndex+1%> of <%#fvHeader.PageCount %></span>&nbsp; <asp:Button ID="btnBack" runat="server" CommandArgument="Prev" CommandName="Page" CssClass="btnHdr" Text="&lt;&lt; Back" />&nbsp; <asp:Button ID="btnNext" runat="server" CommandArgument="Next" CommandName="Page" CssClass="btnHdr" Text="Next &gt;&gt;" />&nbsp;</PagerTemplate> ”就是我所说的“fvHeader”。

后退/下一步按钮C#编码和数据绑定第一张表格视图:

formview1

以下是我尝试浏览第二张表单时收到的错误消息。

    protected void fvHeader_PageIndexChanging(object sender, FormViewPageEventArgs e)
            {
                    fvHeader.PageIndex = e.NewPageIndex;
                    bindFV_Initial(); 

                    //rebind fvSub1 (2nd formview) to get the 1st obs of the newly selected header record
                    fvSub1.ChangeMode(FormViewMode.Edit);
                    fvSub1.PageIndex = 0;
                    bindSub1_Initial();

//rebind 2nd subform
                    fvSub2.ChangeMode(FormViewMode.Edit);
                    fvSub2.PageIndex = 0;
                    bindSub2_Initial(); 

            }
     private void bindFV_Initial()
            {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }

                    conn.Open();

                    if (dtEOS == null || dtEOS.Rows.Count == 0)
                    {
                        sqlda = new SqlDataAdapter("USE dbWEF SELECT * FROM tblHeader WHERE [UserID] = '" + Session["User"] + "' AND [ProjectName] = '" + Session["Project"] + "'", conn); 
                        sqlda.Fill(dtEOS);
                    }

                    fvHeader.DataSource = dtEOS;
                    fvHeader.DataBind();

                    conn.Close();

                    if (dtEOS.Rows.Count > 0)
                    {
                        fillDD_fvHeader(); //Fill dropdowns and databind ddls
                    }
                }

            }

在调试过程中,我发现当第二个formview被绑定时会发生这个错误,因为数据表是空的,这是因为它需要来自formview1的datakey来提取正确的数据,因为formview1的数据源是null去零。但是再次单击formview的后退按钮,重新填充并记录数据源,从而允许formview2完美填充和导航。太奇怪了......

1 个答案:

答案 0 :(得分:0)

我建议你简化代码。 您很可能与视图状态创建冲突。 我们无法看到您的dataSource:(dtEOS)的定义位置和方式。 但是我猜它会在回电时有条件地重置。 这是ASP.net中的常见问题(与视图状态和/或数据绑定冲突)。

尝试使用网格而不是formview,它将更优雅地处理分页,而无需回发和数据重新绑定。

相关问题