Не удается реализовать разбиение на страницы в JQGRID с использованием ASP.NET - PullRequest
0 голосов
/ 06 января 2011

Я реализовал простой код для привязки данных к jqgrid в asp.net, у меня изначально была проблема с сортировкой сетки, но я смог ее преодолеть.Теперь меня беспокоит то, что я не могу реализовать нумерацию страниц в Jqgrid.Было бы здорово, если бы кто-нибудь мог помочь мне с этим.Вот мой код aspx.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Web.Script.Serialization" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Web.Services" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="ui.jqgrid.css" rel="stylesheet" type="text/css" />

    <script type="text/javascript" src="jquery-1.4.4.min.js"></script>

    <%--<link href="jquery-ui-1.8.2.custom.css" rel="stylesheet" type="text/css" />--%>

    <script src="grid.locale-en.js" type="text/javascript"></script>

    <script src="jquery.jqGrid.min.js" type="text/javascript"></script>

    <script src="json2.js" type="text/javascript"></script>

    <link href="jquery-ui-1.8.7.custom.css" media="screen" rel="stylesheet" type="text/css" />

    <script type="text/javascript">
        $(document).ready(function() {
            $('#submit').click(function() {
                $('#list').jqGrid({
                    datatype: function(postdata) {

                        var params = new Object();
                        params.page = postdata.page;
                        params.pageSize = postdata.rows;
                        params.sortIndex = postdata.sidx;
                        params.sortDirection = postdata.sord;

                        $.ajax({
                            url: 'Default.aspx/GetData',
                            type: 'POST',
                            data: JSON.stringify(params),
                            // dataType: "json",     
                            contentType: "application/json; charset=utf-8",
                            error: function(data, textStatus) {
                                alert('Error loading json');
                            },
                            success: function(data, st) {
                                if (st == 'success') {
                                    var grid = $("#list");
                                    var gridData = JSON.parse(data.d);
                                    grid.clearGridData();
                                    for (var i = 0; i < gridData.length; i++) {
                                        grid.addRowData(i + 1, gridData[i]);
                                    }
                                }
                            }
                        });
                    },
                    colNames: ['Product ID', 'Product Name', 'Product Number'],
                    colModel: [
                       { name: 'ProductID', index: 'ProductID', sort: true, width: 80, align: 'center', sorttype: "int" },
                       { name: 'Name', index: 'Name', width: 120, align: 'center' },
                       { name: 'ProductNumber', index: 'ProductNumber', width: 120, align: 'center'}],
                    pager: $("#pager"),
                    height: 200,
                    width: 600,
                    rowNum: 20,
                    rowList: [10, 20, 30],
                    rownumWidth: 40,
                    sortorder: 'desc',
                    loadonce: true,
                    records: 20,
                    viewRecords: true
                });
            });
        });
        //        }).navGrid('#pager', { search: true, edit: false, add: false, del: false, searchtext: "Search" });       
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" runat="server">
    </asp:ScriptManager>
    <input type="button" id="submit" value="Fetch" title="Fetch" />
    <table id="list">
    </table>
    <div id="pager">
    </div>
    </form>
</body>
</html>

А это мой код за страницей

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.Collections.Generic;
using System.Text;
using System.Web.Script.Serialization;
using System.Web.Script.Services;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    [WebMethod]
    public static string GetData(int page, int pageSize, string sortIndex, string sortDirection)
    {
        string connectionString = GetConnectionString();
        string queryString = string.Empty;
        if (sortIndex == "")
        {
            queryString = "SELECT top " + pageSize + " ProductID,Name,ProductNumber FROM [AdventureWorks].[Production].[Product]";

        }
        else
        {
            queryString = "SELECT top " + pageSize + " ProductID,Name,ProductNumber FROM [AdventureWorks].[Production].[Product] ORDER BY " + sortIndex + " " + sortDirection;
        }
        DataSet ds = new DataSet();
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        SqlCommand command = connection.CreateCommand();

        command.CommandText = queryString;
        SqlDataAdapter da = new SqlDataAdapter(queryString, connectionString);
        da.Fill(ds, "product");
        DataTable dt = ds.Tables["product"];
        IList<Product> pd = new List<Product>();
        connection.Close();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                Product p = new Product();
                p.ProductID = dt.Rows[i]["ProductID"].ToString();
                p.Name = Convert.ToString(dt.Rows[i]["Name"]);
                p.ProductNumber = Convert.ToString(dt.Rows[i]["ProductNumber"]);
                pd.Add(p);
                p = null;
            }

        JavaScriptSerializer jsonSerz = new JavaScriptSerializer();

           string serializedData = jsonSerz.Serialize(pd); 
           pd = null;
           return serializedData;
    }

    static private string GetConnectionString()
    {
        return "Data Source=INMDCD0109\\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=SSPI";
    }
}
public class Product
{

    public string ProductID { get; set; }

    public string Name { get; set; }

    public string ProductNumber { get; set; }
}

Заранее спасибо

1 Ответ

0 голосов
/ 07 января 2011

Я уже писал вам в предыдущем моем ответе много предложений о том, как улучшить ваш код. Поскольку вы не пишете никаких комментариев к моему предыдущему ответу, я буду коротким сейчас.

Если вам нужно реализовать нумерацию страниц, достаточно использовать оператор типа SELECT TOP 10 только для первой страницы из 10 строк. Если вам нужно вернуть, например, 6-ю страницу, вам нужно пропустить 50 первых строк, а затем получить следующие 10. Если возвращаемые вами данные содержат идентификатор (ProductID в вашем случае), вы можете сделать это, например, с помощью следующий оператор, использующий общее табличное выражение (CTE) :

WITH Previous (ProductID,Name,ProductNumber) AS (
    SELECT TOP 50 ProductID,Name,ProductNumber
    FROM [AdventureWorks].[Production].[Product]
)
SELECT TOP 10 T.ProductID,T.Name,T.ProductNumber
FROM [AdventureWorks].[Production].[Product] AS T
    LEFT OUTER JOIN Previous AS P ON T.ProductID=P.ProductID
WHERE P.ProductID IS NULL

Если возвращенные данные не содержат идентификатора, то вы можете использовать ROW_NUMBER для реализации нумерации страниц.

ОБНОВЛЕНО: Еще одно небольшое замечание. Использование DataSet, DataTable и SqlDataAdapter в вашем примере неэффективно. Использование command.ExecuteReader ( SqlCommand :: ExecuteReader ), которое возвращает SqlDataReader, кажется мне здесь лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...