在Postback上保存值

时间:2011-12-02 04:47:08

标签: asp.net datagrid

我一直在为数据网格做自定义分页,我每页只检索10个值。所以,我开始这样做:

    <asp:GridView ID="grid1" runat="server" 
    >  </asp:GridView>

    <asp:Button ID="Btn_Previous" CommandName="Previous" runat="server"   
      OnCommand="ChangePage" Text="Previous" />
    <asp:Button ID="Btn_Next" runat="server" CommandName="Next" OnCommand="ChangePage" 
    Text="Next" />
   <asp:Label ID="lblTotalPages" runat="server"></asp:Label>
   <asp:Label ID="lblCurrentPage" runat="server"></asp:Label>

     protected int currentPageNumber = 1;
    protected const int PAGE_SIZE = 10;
    protected int startrowindex=1;

    protected void Page_Load(object sender, EventArgs e)
    {

        BindData();
    }
    private void BindData()
    {

        using (SqlConnection conn = new SqlConnection("Data Source=NISHANTH-PC\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"))
        {
            conn.Open();
            SqlCommand myCommand = new SqlCommand("GetProductsPaged",
                                                   conn);
            myCommand.CommandType = CommandType.StoredProcedure;

            myCommand.Parameters.AddWithValue("@startRow",
                                              startrowindex);
            myCommand.Parameters.AddWithValue("@maximumRows", PAGE_SIZE);
            myCommand.Parameters.Add("@totalRows", SqlDbType.Int, 4);
            myCommand.Parameters["@totalRows"].Direction = ParameterDirection.Output;



            SqlDataAdapter ad = new SqlDataAdapter(myCommand);

            DataSet ds = new DataSet();
            ad.Fill(ds);

            grid1.DataSource = ds;
            grid1.DataBind();

            double totalRows = (int)myCommand.Parameters["@totalRows"].Value;

            lblTotalPages.Text = CalculateTotalPages(totalRows).ToString();

            lblCurrentPage.Text = currentPageNumber.ToString();

            if (currentPageNumber == 1)
            {
                Btn_Previous.Enabled = false;

                if (Int32.Parse(lblTotalPages.Text) > 0)
                {
                    Btn_Next.Enabled = true;
                }
                else
                    Btn_Next.Enabled = false;

            }

            else
            {
                Btn_Previous.Enabled = true;

                if (currentPageNumber == Int32.Parse(lblTotalPages.Text))
                    Btn_Next.Enabled = false;
                else Btn_Next.Enabled = true;
            }
            conn.Close();
        }
    }
    private int CalculateTotalPages(double totalRows)
    {
        int totalPages = (int)Math.Ceiling(totalRows / PAGE_SIZE);

        return totalPages;
    }
    protected void ChangePage(object sender, CommandEventArgs e)
    {

        switch (e.CommandName)
        {
            case "Previous":
                currentPageNumber = currentPageNumber - 1;
                startrowindex = startrowindex - 10;
                break;

            case "Next":
                currentPageNumber = currentPageNumber + 1;
                startrowindex = startrowindex + 10;
                break;
        }

        BindData();
    } 

基本上,我的问题是网页加载时网格工作正常。然后,由于之前是隐藏的,当我点击下一步它进入第二页并完美地检索值。但是,当我现在点击下一个或上一个时,它就会出错。我认为的原因是,当我回来时,top上的currentpagenumber值再次变为1,startroeindex也变为1.你可以让我知道我能处理的方式吗?

2 个答案:

答案 0 :(得分:0)

我不知道您的aspx页面,但您需要一种方法来发送上一页码。否则,您的脚本不知道下一个意味着什么,除了1 + 1。你如何改变页面?超链接?如果是,请在表单字段或查询字符串中发送最后一页。

答案 1 :(得分:0)

首先,你要在每个帖子上加载BindData,你必须只在第一次加载时调用它。

第二件事,你正在存储标签,lblCurrentPage.Text = currentPageNumber.ToString();那么为什么不使用相同的内容并将其再次存储在page_load事件中。

我在这里提供了page_load事件试试这个。

protected void Page_Load(object sender, EventArgs e)
{
   currentPageNumber = Convert.ToInt32(lblCurrentPage.Text);
   if(!IsPostback)
   {
      BindData();
   }
}

请将lblCurrentPage.Text的默认值添加到1。