我想通过说我是asp.net的初学者来开头,特别是在使用FormView
控件时。我经过长时间的努力搜索,花了好几个小时来调试这个问题。
我在一个aspx页面上有3个FormViews
。每个FormView
都有自己的EditItemTemplate
和PagerTemplate
以及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()
,但没有成功。我还尝试在分页按钮上设置属性:formview2
和UseSubmitBehavior="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>
<asp:Button ID="btnBack" runat="server" CommandArgument="Prev" CommandName="Page" CssClass="btnHdr" Text="<< Back" />
<asp:Button ID="btnNext" runat="server" CommandArgument="Next" CommandName="Page" CssClass="btnHdr" Text="Next >>" /> </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完美填充和导航。太奇怪了......
答案 0 :(得分:0)
我建议你简化代码。 您很可能与视图状态创建冲突。 我们无法看到您的dataSource:(dtEOS)的定义位置和方式。 但是我猜它会在回电时有条件地重置。 这是ASP.net中的常见问题(与视图状态和/或数据绑定冲突)。
尝试使用网格而不是formview,它将更优雅地处理分页,而无需回发和数据重新绑定。