【问题标题】:gridview + objectdatasource selectmethod called twicegridview + objectdatasource 选择方法调用了两次
【发布时间】:2013-07-29 04:41:00
【问题描述】:

我有很多记录的 gridview,所以必须使用 ObjectDataSource 以便只获取将显示在页面上的记录,即如果总共有 100 条记录,并且页面大小为 10,则在每个页面上仅单击 10记录是从数据库中获取的。 请在下面找到代码

///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,但问题是用于从数据库中获取记录的方法,即每次点击页面都会调用两次 GRAD_ModuleListforCollection_Subset。 示例:如果我单击第 2 页,则调用该方法 () 第一次使用 startRecord=0,pagesize=20 () 第二次调用 startRecord=20,pagesize=20

如果我单击第 3 页,则单击第 2 页后 () 第一次使用 startRecord=20,pagesize=20 () 第二次调用 startRecord=40,pagesize=20

对于每次页面点击,第一次加载都具有先前的值。

请帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: asp.net gridview objectdatasource


    【解决方案1】:

    如果您在标记部分 (.aspx) 中声明 ObjectDataSource 及其所有设置,则仅在第一次请求页面时才会调用 Select 方法两次(PageIndex 默认为 1)。

    当您从分页链接中选择第 2 页时,它只会调用一次 select 方法,然后调用 SelectCount 方法。

    【讨论】:

      【解决方案2】:

      进行了以下更改以使其正常工作

      1. 为 objectDatasource 启用缓存
        ods.EnableCaching = true;

      2. 设置会话[“排序顺序”]

        grdModulesList.DataSourceID = ods.ID;
        grdModulesList.DataBind();
        if (Session["sortorder"] == null)
            Session["sortorder"] = "Ascending";
        
      3. 添加gridview排序事件

        protected void grdModulesList_Sorting(object sender, GridViewSortEventArgs e) { ods.SelectParameters["SortBy"].DefaultValue = GetSortExpr(e.SortExpression); e.取消=真; //我们必须这样做,否则我们会得到一个异常 }

        public string GetSortExpr(string sortExp)
        {
        
        if (Session["sortorder"].ToString() == "Ascending")
        {
            Session["sortorder"] = "Descending";
            return sortExp + " DESC";
        }
        else
        {
            Session["sortorder"] = "Ascending";
            return sortExp + " ASC";
        }
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 2017-10-15
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多