我有很多记录的gridview,所以不得不使用ObjectDataSource以便只获取将在页面上显示的记录,即如果总共有100条记录,页面大小为10,则每页只需点击10记录从DB中获取。 请找到以下代码
/// ASPX
<asp:GridView ID="grdModulesList" CssClass="moduleList" runat="server"
AutoGenerateColumns="False" HeaderStyle-Font-Size="Smaller"
Font-Size="Small" AllowPaging="true" AllowSorting="True" OnRowCreated="grdModulesList_RowCreated"
OnRowDataBound="grdModulesList_RowDataBound" BackColor="White" BorderColor="Blue"
BorderStyle="None" BorderWidth="1px" CellPadding="3" PageSize="20">
<Columns>
<asp:BoundField DataField="collection_id" Visible="False" />
<asp:BoundField HeaderText="Item" />
<asp:BoundField HeaderText="Module Name" DataField="module_name" SortExpression="module_name"
ControlStyle-CssClass="moduleName" />
<asp:BoundField HeaderText="File Name" DataField="module_file_name" SortExpression="module_file_name" />
<asp:BoundField HeaderText="ID" DataField="defect_number" SortExpression="defect_number" />
<asp:BoundField HeaderText="Actions" />
</Columns>
<RowStyle BorderColor="Blue" BorderStyle="Solid" CssClass="grid_width" BorderWidth="2px"
Height="20px" />
<PagerStyle BackColor="#FFFF99" ForeColor="Red" HorizontalAlign="Center" Height="20px" />
<FooterStyle ForeColor="black" Font-Bold="true" />
<SelectedRowStyle Font-Size="Smaller" />
<HeaderStyle Font-Size="Smaller" BorderStyle="Solid" BackColor="Gold" Font-Bold="True"
ForeColor="Black" Height="30px" />
<AlternatingRowStyle BorderColor="#3366FF" BorderStyle="Solid" BorderWidth="1px" />
</asp:GridView>
//。aspx.cs
ObjectDataSource ods = new ObjectDataSource();
ods.ID = "ods";
ods.SelectMethod = "GRAD_ModuleListforCollection_Subset"; //method to fetch records from DB
ods.EnablePaging = true;
ods.TypeName = "pmAdmin.classes.data.ApplicationData";
ods.StartRowIndexParameterName = "StartRecord";
ods.MaximumRowsParameterName = "PageSize";
ods.SortParameterName = "SortBy";
ods.SelectCountMethod = "GRAD_Total_Modules";
Parameter p1 = new Parameter("userID", TypeCode.String, userId);
ods.SelectParameters.Add(p1);
panelModuleList.Controls.Add(ods); //add objectDatasource control to a panel
grdModulesList.DataSourceID = ods.ID;
grdModulesList.DataBind();
//方法GRAD_ModuleListforCollection_Subset
public System.Data.DataSet GRAD_ModuleListforCollection_Subset(string userID, int StartRecord, int PageSize, string SortBy)
{}
记录被正确地绑定到Gridview,但问题是用于从DB获取记录的方法,即每次点击页面时, GRAD_ModuleListforCollection_Subset 被调用两次。 例如:如果我点击第2页,则调用该方法 ()第一次使用startRecord = 0,pagesize = 20 ()第二次调用startRecord = 20,pagesize = 20
点击第2页后,如果我点击第3页 ()第一次使用startRecord = 20,pagesize = 20 ()第二次调用startRecord = 40,pagesize = 20
对于每个页面点击,第一次加载具有以前的值。
请帮我解决这个问题。
提前致谢。
答案 0 :(得分:0)
进行了以下更改以使其正常工作
启用objectDatasource的缓存 ods.EnableCaching = true;
设置Session [“sortorder”]
grdModulesList.DataSourceID = ods.ID;
grdModulesList.DataBind();
if (Session["sortorder"] == null)
Session["sortorder"] = "Ascending";
添加gridview排序事件
protected void grdModulesList_Sorting(object sender,GridViewSortEventArgs e) { ods.SelectParameters [“SortBy”]。DefaultValue = GetSortExpr(e.SortExpression); e.Cancel = true; //我们必须这样做,否则我们会得到一个例外 }
public string GetSortExpr(string sortExp)
{
if (Session["sortorder"].ToString() == "Ascending")
{
Session["sortorder"] = "Descending";
return sortExp + " DESC";
}
else
{
Session["sortorder"] = "Ascending";
return sortExp + " ASC";
}
}
答案 1 :(得分:0)
如果在标记部分(.aspx)中声明ObjectDataSource
及其所有设置,则只有在第一次请求页面时才会调用Select方法两次(PageIndex默认为1)。
当您从分页链接中选择第2页时,它只会调用select方法,然后调用SelectCount
方法。