Phân trang trong winform

 

Phân trang trong winform - Paging in winform. Hướng dẫn chi tiết + Source code

Phân trang trong web là 1 phương pháp được sử dụng rất phổ biến. Nhưng phân trang trong winform thì thế nào? Đó là ý tưởng hay mà chính mình, rất nhiều sinh viên và nhiều người lập trình không hề hay ít khi nghĩ tới. Mình xin tut bài này để cho mọi người có thể tham khảo, trao đổi. Có gì sai sót mong các bạn cứ thẳng thắn cho ý kiến.

Ý tưởng:
- Thay vì load tất cả các dòng (record) để đưa ra lưới, thì chúng ta chỉ thực hiện đếm số dòng để phân trang.
- Số trang sẽ được add vào 1 combobox.
- Thông tin của trang đó sẽ được lấy về bằng 1 câu lệnh truy vấn thông qua sự kiến combo_selectIndexChange.

Thực hiện:

Bước 1: Tạo 1 Form gồm: 1 datagridView: đưa giá trị nhận được lên, 1 numberUpDown: chỉnh số dòng muốn hiển thị trên datagridView , 1 comboBox: lưu số trang và để thực hiện chuyển trang.

Bước 2: Khai báo các biến
        int currentPageIndex = 1;
        int pageSize = 17; //Số dòng hiển thị lên lưới
        int pageNumber = 0; //Số trang
        int fistRow, lastRow; //Dòng bắt đầu, dòng kết thúc cho việc truy vấn dữ liệu
        int rows; //Số dòng được trả về từ câu truy vấn trong formLoad
//SQL connection bạn thay đổi sao cho phù hợp với CSDL của mình, Mình chỉ post code thôi :D
        SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=QLSX;Integrated Security=True");

Bước 3: Trong sự kiện formLoad
private void Form1_Load(object sender, EventArgs e)
{
     string sql = "select count(*) as MaxNumber from KyHieuSo";//Đếm số dòng để phân trang, các bạn nhớ đổi KyHieuSo thành tên bảng phù hợp nha
     SqlCommand cmd = new SqlCommand(sql, conn);
     conn.Open();
     rows = Convert.ToInt32(cmd.ExecuteScalar()); //Số dòng nhận được
     pageTotal();
     conn.Close();
 }

Bước 4: Tạo hàm PageTotal đển phân trang và add số trang vào comboBox
void pageTotal()
{
    pageNumber = rows % pageSize != 0 ? rows / pageSize + 1 : rows / pageSize;
    label3.Text = " / " + pageNumber.ToString();
    cmbPage.Items.Clear();
    for (int i = 1; i < pageNumber; i++)
    {
        cmbPage.Items.Add(i + "");
    }
    cmbPage.SelectedIndex = 0;
}

Bước 5: Khi click chọn trang thì thực hiện câu lệnh truy vấn
  private void cmbPage_SelectedIndexChanged(object sender, EventArgs e)
  {
      currentPageIndex = Convert.ToInt32(cmbPage.Text);
      fistRow = pageSize * (currentPageIndex - 1); //Dong dau
      lastRow = pageSize * (currentPageIndex);//Dong cuoi cua 1 trang duoc chon.
      //MessageBox.Show(fistRow + " " + lastRow);
      string sql = "select Row_number() over(order by KyHieu) STT, * from KyHieuSo";
      SqlDataAdapter da = new SqlDataAdapter(sql, conn);
      DataSet ds = new DataSet();
      da.Fill(ds, fistRow, pageSize, "KyHieuSo");
      dataGridView1.DataSource = ds.Tables[0];
  }

Thế là xong! Nếu bạn chưa tin, hãy bật TaskManager lên để so sánh dung lượng chiếm dụng bộ nhớ của phần mềm chưa phân trang và phần mềm đã phân trang, dung lượng của chương trình đã phân trang giảm đi rất nhiều (thời gian nhanh hơn hay không thì mình chưa test kĩ, hi)

(Chú ý: đây là chương trình có tính minh họa, vì vậy các bạn phải đổi đường dẫn CSDL...)
Ntech Developers

Programs must be written for people to read, and only incidentally for machines to execute.

Post a Comment

Previous Post Next Post