Phân trang trong winform - Paging in winform. Hướng dẫn chi tiết + Source code
Ý 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
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
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
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...)
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...)
Tags:
winform