【问题标题】:Error in loading data from database to gridview using ajax json C#使用ajax json C#将数据从数据库加载到gridview时出错
【发布时间】:2014-10-12 05:42:35
【问题描述】:

我正在尝试在滚动页面时将数据从数据库加载到gridview。它的工作原理是这样的

1) 最初加载页面时,gridview 会从database 中显示 10 个数据(工作正常)

2)在滚动gridview 时显示要加载的图像,然后使用 ajax json 方法调用服务器端函数以从数据库中加载接下来的 5 个数据

3) 成功点击此函数后,javascript 会删除要加载的图像,并在 gridview 中附加下 5 个数据。

现在的问题是删除图像后,gridview 在接下来的 5 次中一次又一次地显示数据库中的第一个数据。请帮忙..

C#

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            newscontainer.DataSource = GetNewsPageWise(1, 10);
            newscontainer.DataBind();
        }
    }

    public static DataSet GetNewsPageWise(int pageIndex, int pageSize)
    {
        string constring = "server=***;uid=***;pwd=******;database=*******";
        using (SqlConnection con = new SqlConnection(constring))
        {
            using (SqlCommand cmd = new SqlCommand("[GetNewsPageWise]"))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
                cmd.Parameters.AddWithValue("@PageSize", pageSize);
                cmd.Parameters.Add("@PageCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataSet ds = new DataSet())
                    {
                        sda.Fill(ds, "popnews");
                        DataTable dt = new DataTable("PageCount");
                        dt.Columns.Add("PageCount");
                        dt.Rows.Add();
                        dt.Rows[0][0] = cmd.Parameters["@PageCount"].Value;
                        ds.Tables.Add(dt);
                        return ds;
                    }
                }
            }
        }
    }

    [WebMethod]
    public static string GetCustomers(int pageIndex)
    {
        //Added to similate delay so that we see the loader working
        //Must be removed when moving to production
        System.Threading.Thread.Sleep(2000);
        return GetNewsPageWise(pageIndex, 5).GetXml();
    }

}

Javascript

<script type="text/javascript">
var pageIndex = 1;
var pageCount;
$(function () {
    //Remove the original GridView header
    $("[id$=newscontainer] tr").eq(0).remove();
});
//Load GridView Rows when DIV is scrolled
$(window).scroll(function () {
    if ($(window).scrollTop() == $(document).height() - $(window).height()) {
        GetRecords();
    }
});
//Function to make AJAX call to the Web Method
function GetRecords() {
    pageIndex++;
    if (pageIndex == 2 || pageIndex <= pageCount) {

        //Show Loader
        if ($("[id$=newscontainer] .loader").length == 0) {
            var row = $("[id$=newscontainer] tr").eq(0).clone(true);
            row.addClass("loader");
            row.children().remove();
            row.append('<td colspan = "999" style = "background-color:white"> <asp:Image ID="loader" runat="server" Height="50px" ImageUrl="~/Images/loader.gif" Width="51px" /></td>');
            $("[id$=newscontainer]").append(row);
        }
        $.ajax({
            type: "POST",
            url: "News.aspx/GetCustomers",
            data: '{pageIndex: ' + pageIndex + '}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnSuccess,
            failure: function (response) {
                alert(response.d);
            },
            error: function (response) {
                alert(response.d);
            }
        });
    }
}


 function OnSuccess(response) {
    var xmlDoc = $.parseXML(response.d);
    var xml = $(xmlDoc);
    pageCount = parseInt(xml.find("PageCount").eq(0).find("PageCount").text());
    var customers = xml.find("popnews");
    $("[id$=newscontainer] .loader").remove();
    customers.each(function () {
        var customer = $(this);
        var row = $("[id$=newscontainer] tr").eq(0).clone(true);
        $(".postedon").html(customer.find("newsdate").text());
        $(".news").html(customer.find("news").text());
        $("[id$=newscontainer]").append(row);
    });

    //Hide Loader
    $("#loader").hide();
}

使用的存储过程

            SET ANSI_NULLS ON
            GO
            SET QUOTED_IDENTIFIER ON
             GO
            CREATE PROCEDURE [dbo].[GetNewsPageWise]
             @PageIndex INT = 1
                ,@PageSize INT = 10
               ,@PageCount INT OUTPUT
                 AS
                BEGIN
               SET NOCOUNT ON;
            SELECT ROW_NUMBER() OVER
                (
                   ORDER BY [newsid] ASC
                 )AS RowNumber
                   ,[newsid]
                   ,[news]
                  ,[newsdate]
                    ,[newstime]
                    INTO #Results
                  FROM [popnews]

                   DECLARE @RecordCount INT
                    SELECT @RecordCount = COUNT(*) FROM #Results

                 SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) /            
                 CAST(@PageSize AS DECIMAL(10, 2)))
                    PRINT       @PageCount

                        SELECT * FROM #Results
                       WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 
                         AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

                      DROP TABLE #Results
                         END

【问题讨论】:

  • 我认为问题不在 AJAX 中,尝试将调试点放在 GetNewsPageWise() 中并检查返回的 ds 的内容。

标签: c# javascript asp.net ajax gridview


【解决方案1】:

你的数据是一个字符串,data: '{pageIndex: ' + pageIndex + '}',,应该是
data: {pageIndex: pageIndex}
请确保您的 ajax 请求已发送到服务器,并且您可以获得正确的响应。您可以在 chrome 或 firebug 中签入开发工具。

而且,您没有粘贴 onSuccess 函数。正如您所说,回调函数无法正常工作以添加新数据。也许原因就在那里。

[更新]
你的成功函数是:

customers.each(function () {
    var customer = $(this);
    var row = $("[id$=newscontainer] tr").eq(0).clone(true);
    $(".postedon").html(customer.find("newsdate").text()); //problem
    $(".news").html(customer.find("news").text());         //problem
    $("[id$=newscontainer]").append(row);
});

在标记为“问题”的行中,您为元素设置的文本具有这些类。因此,将选择具有该类的所有元素。我认为您想要的是为克隆的行元素设置数据。请尝试:

$(".news", row).html(customer.find("news").text());

它将在行中找到类为“news”的元素。

【讨论】:

  • 现在我已经粘贴了onSuccess函数请看一下
  • 同样的问题仍然没有运气
【解决方案2】:

我在第一个站点看到的一件事是,在 ajax 调用中您有 dataType: "json",但是从 Web 方法中您返回的是 XML 格式的结果,因此 dataType 属性应该设置为“xml”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 2019-06-30
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多