- [TOOL] Chia sẻ phần mềm thay đổi thông tin cấu hình máy tính
- [C#] Hướng dẫn Export dữ liệu ra file Microsoft Word Template
- [C#] Chia sẻ source code tool kiểm tra domain website
- [C#] Hướng dẫn tạo file PDF sử dụng thư viện QuestPDF
- [C#] Hướng dẫn tạo ứng dụng dock windows giống Taskbar
- [C#] Chia sẻ source code sử dụng Object Listview trên Winform
- [VB.NET] Chia sẻ source code quản lý thu chi mô hình 3 lớp Winform
- [DATABASE] Xóa lịch sử danh sách đăng nhập tài khoản trên SMSS Sqlserver Management Studio
- [C#] Sử dụng FolderBrowserDialog Vista trên Winform
- [DEVEXPRESS] Chia sẻ tool Winform UI Templates Early Access Preview (EAP)
- [C#] Chia sẻ source code Spin Content (Trộn nội dung văn bản theo từ đồng nghĩa) trên Winform
- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
Phân trang dữ liệu cho DataGridView giống như Web
Có khi nào khi lập trình ứng dụng với số lượng dòng dữ liệu quá nhiều dẫn đến mỗi lần muốn show dữ liệu thì mất quá nhiều thời gian để load. Vì lý do đó mà bài viết hôm nay mình sẽ giới thiệu cho các bạn một cách đó là kỹ thuật phân trang dữ liệu giống như các bạn hay thấy trên web.
Cách này thực chất là bạn tính toán xem có bao nhiêu dòng dữ liệu và mõi lần lấy dữ liệu về thì theo số lượng dòng nhất định để giảm thời gian load. Bây giờ mình cùng bắt đầu thực hiện nha:
Đầu tiên các bạn thiết kế form như hình. Form bao gồm DataGridView để hiển thị, Combobox đê chọn trang, NumericUpDown để quy định bao nhiêu dòng trên 1 trang dữ liệu và 1 Label để hiển thị tổng số trang
Chương trình sẽ bao gồm các sự kiện sau
Load += Form1_Load;
nudNumber.ValueChanged+=nudNumber_ValueChanged;
cboPage.SelectedIndexChanged+=cboPage_SelectedIndexChanged;
Các biến sử dụng trong chương trình
int currentPageIndex = 1;
int pageSize = 20;
int pageNumber = 0;
int fistRow, lastRow;
int rows;
SqlConnection conn = new SqlConnection("Chuỗi kết nối");
Sự kiện khi Load form
void Form1_Load(object sender, EventArgs e)
{
string sql = "select count(*) as MaxNumber from ITSVT";//Muc dich de lay ra so dong.
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
rows = Convert.ToInt32(cmd.ExecuteScalar());
pageTotal();
conn.Close();
}
Hàm dùng để tính toán có bao nhiêu trang
void pageTotal()
{
pageNumber = rows % pageSize != 0 ? rows / pageSize + 1 : rows / pageSize; //Tính xem có báo nhiêu trang nếu có pageSize trên trang
lblTotal.Text = " / " + pageNumber.ToString();
cboPage.Items.Clear();
for (int i = 1; i < pageNumber; i++)
cboPage.Items.Add(i + "");
cboPage.SelectedIndex = 0;
}
Tiếp đến là sự kiện khi thay đổi số dòng mặc định trên 1 trang dữ liệu
private void nudNumber_ValueChanged(object sender, EventArgs e)
{
pageSize = Convert.ToInt32(nudNumber.Value);
pageTotal();
}
Và cuối cùng là sự kiện khi ta chọn 1 trang bất kỳ trong tổng số trang
void cboPage_SelectedIndexChanged(object sender, EventArgs e)
{
currentPageIndex = Convert.ToInt32(cboPage.Text);
fistRow = pageSize * (currentPageIndex - 1); //Dòng đầu
lastRow = pageSize * (currentPageIndex);//Dòng cuối cùng của trang được chọn
string sql = "select Row_number() over(order by ITS_REC_VT) STT, MA_VT,TEN_VT,TEN_VT2 from ITSVT"; //Column ITS_REC_VT thường nên chọn là column làm khóa chính
//Có thể dùng Select * hoặc chỉnh định vài column cần thiết để cải thiện tốc độ load dữ liệu. Như vd ở trên của mình là các column: MA_VT,TEN_VT,TEN_VT2
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds, fistRow, pageSize, "ITSVT"); //Lấy dữ liệu về từ dòng thứ fistRow và lấy pageSize dòng
dataGridView1.DataSource = ds.Tables[0];
}
Và cuối cùng là nhấn F5 để chạy và thưởng thức thành quả.
Nếu bạn chọn 1 trang bất kỳ trong tổng số trang thì chương trình sẽ load về những dữ liệu tương ứng
Chúc các bạn thành công. Có thắc mắc hãy comment lại mình sẽ giải thích và nếu thấy hữu ích hãy like hoặc shared để giới thiệu page của chúng mình trên facebook nhằm tạo động lực để nhóm tụi mình làm nhiều bài hơn để chia sẻ cho các bạn. Cảm ơn!
Link download nếu bạn làm biếng code lại