Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 24 kết quả

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

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    78

    Mặc định Phân trang trong winform - Paging in winform. Hướng dẫn chi tiết + Source code

    Trước tiên mình xin cám ơn longtth - là 1 thành viên trong diễn đàn.
    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 tôi, 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. Được sự giúp đỡ và giới thiệu ý tưởng của mem longtth,tôi xin mạo mụi 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
    Visual C# Code:
    1.         int currentPageIndex = 1;
    2.         int pageSize = 17; //Số dòng hiển thị lên lưới
    3.         int pageNumber = 0; //Số trang
    4.         int fistRow, lastRow; //Dòng bắt đầu, dòng kết thúc cho việc truy vấn dữ liệu
    5.         int rows; //Số dòng được trả về từ câu truy vấn trong formLoad
    6. //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
    7.         SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=QLSX;Integrated Security=True");
    Bước 3: Trong sự kiện formLoad
    Visual C# Code:
    1.         private void Form1_Load(object sender, EventArgs e)
    2.         {
    3.  
    4.             string sql = "select count(*) as MaxNumber from KyHieuSo";//Đếm số dòng để phân trang, các bạn nhớ đổi KyHieuSo thành [B]tên bảng[/B] phù hợp nha
    5.             SqlCommand cmd = new SqlCommand(sql, conn);
    6.             conn.Open();
    7.             rows = Convert.ToInt32(cmd.ExecuteScalar()); //Số dòng nhận được
    8.             pageTotal();
    9.             conn.Close();
    10.         }
    Bước 4: Tạo hàm PageTotal đển phân trang và add số trang vào comboBox
    Visual C# Code:
    1.         void pageTotal()
    2.         {
    3.             pageNumber = rows % pageSize != 0 ? rows / pageSize + 1 : rows / pageSize;
    4.             label3.Text = " / " + pageNumber.ToString();
    5.             cmbPage.Items.Clear();
    6.             for (int i = 1; i < pageNumber; i++)
    7.             {
    8.                 cmbPage.Items.Add(i + "");
    9.             }
    10.             cmbPage.SelectedIndex = 0;
    Bước 5: Khi click chọn trang thì thực hiện câu lệnh truy vấn
    Visual C# Code:
    1.         private void cmbPage_SelectedIndexChanged(object sender, EventArgs e)
    2.         {
    3.             currentPageIndex = Convert.ToInt32(cmbPage.Text);
    4.             fistRow = pageSize * (currentPageIndex - 1); //Dong dau
    5.             lastRow = pageSize * (currentPageIndex);//Dong cuoi cua 1 trang duoc chon.
    6.             //MessageBox.Show(fistRow + " " + lastRow);
    7.             string sql = "select Row_number() over(order by KyHieu) STT, * from KyHieuSo";
    8.             SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    9.             DataSet ds = new DataSet();
    10.             da.Fill(ds, fistRow, pageSize, "KyHieuSo");
    11.             dataGridView1.DataSource = ds.Tables[0];
    12.         }

    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...)
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    02 2011
    Bài viết
    114

    Chưa test nhưng ý tưởng rất hay. cám ơn bác

  3. #3
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Trích dẫn Nguyên bản được gửi bởi TheHalfHeart Xem bài viết
    Chưa test nhưng ý tưởng rất hay. cám ơn bác
    cái vụ này thật ra ko lạ gì đối với những ai đi học trung tâm đâu bạn, nếu bạn ở TPHCM thì nên vào Trung Tâm Hữu Khang, mình từng học đó ra ^^ dạy cũng ok lắm

    mình có vài ý kiến cho bạn chủ topic (thảo luận thôi chứ ko phê bình ^^):
    phân trang thì lấy dữ liệu ra ít nên sẽ đỡ ngốn ram rồi phân trang nên sử dụng cte (Common Table Expression) (nếu biết sử dụng) trong sql và tốc độ load dữ liệu sẽ nhanh hơn, vì bình thường (ko phân trang) sẽ load hết dữ liệu trong sql rồi mới load hết lên Controls, còn nếu phân trang thì sử dụng cte load dữ liệu lên hết và lấy 1 phần ra Controls, mà sql chạy nhanh hơn các ngôn ngữ khác như c#, vb,... nên tất nhiên sẽ chạy nhanh hơn
    còn 1 chỗ cơ bản cần chú ý đến: khi select nên tránh dùng dấu sao (*), vì nó sẽ làm chậm chương trình, nên ghi rõ các fields cần lấy thôi, chứ dư fields chỉ làm load lâu hơn thôi chứ đâu được gì ^^! tốt nhất ko bao h sử dụng dấu (*) là ok
    Email : leminhphuoc89@gmail.com

  4. #4
    Ngày gia nhập
    05 2011
    Bài viết
    78

    Thanks bạn đã có ý kiến .
    Bạn có thể nói rõ Common Table Expression cho mọi người cùng tham khảo không ?
    tốt nhất ko bao h sử dụng dấu (*) là ok
    Không dùng * thì không count được bạn à? Mình cũng mới làm quen với CSDL, C# nên còn khá gà, bạn có cách nào hay cứ bình luận nha. Để cho a e congdongcviet cùng học hỏi.

    còn nếu phân trang thì sử dụng cte load dữ liệu lên hết và lấy 1 phần ra Controls, mà sql chạy nhanh hơn các ngôn ngữ khác như c#, vb,
    @Câu in đậm:
    Thế lấy lên hết thì có khác gì không phân trang không bạn? Câu nói của bạn có nghĩa là chi show ra, còn ram thì vẫn ngốn???

  5. #5
    Ngày gia nhập
    02 2010
    Bài viết
    52

    ko sử dụng * thì mình chỉ định rõ 1 field nào đó ra luôn có gì mà ko được bạn (count(MaHD)), tốt nhất nên chỉ định cột nào là khóa (trường hợp khi sort sẽ nhanh hơn)
    cách sử dụng cte, mình ví dụ 1 Store Procedure, show dữ liệu được phân trang trong procedure nhé:
    Code:
    Create Procedure Proce_HoaDon
        @Page int,
        @CountRecordInPage = 30
    as
        with cteHoaDon
        (
             select Row_Number() over(order by NgayDatHang desc) as STT, MaHD, NgayDatHang, NgayGiaoHang from HoaDon
        )
        select * from cteHoaDon where STT >= ((@Page - 1) * @CountRecordInPage + 1) and STT <= (@Page * @CountRecordInPage)
    ở trên là đoạn code tạo Procedure đơn giản của bảng Hóa Đơn (chỉ thí dụ thôi)
    @Page là tham số truyền từ Form vào, @CountRecordInPage là số Record trong 1 trang
    with cteHoaDon là tạo 1 bảng dữ liệu và load các field trên từ bảng Hóa Đơn vào (cteHoaDon là 1 bảng ảo được lưu tạm thời, sau khi sử dụng xong sẽ tự động hủy)
    select * from cteHoaDon, cái dòng này mình sử dụng * vì mình lấy hết các field mình đã chọn lọc trong cteHoaDon, khi cte được sử dụng ở dòng này thì nó sẽ tự động hủy luôn (bạn ko tin thì from cte 2 lần xem được ko ) cho nên sẽ ko ngốn ram về phần này, nó chỉ lấy đúng số dòng ta cần và đưa lên form, nên tất nhiên sẽ nhanh và nhẹ hơn ko phân trang nhiều, nếu bạn biết sử dụng cte thì bạn nên dùng nó hay hơn, và sql chạy cũng nhanh hơn nữa

    lưu ý: ở trên mình sort với field NgayDatHang, mà field này ko phải khóa hay gì, nên tốc độ sort ko thể tốt hơn, trường hợp này bạn nên set chỉ mục "index" cho field đó trước (dữ liệu càng nhiều thì mới thấy rõ) và nhớ đừng lạm dụng mấy cái chỉ mục này nhé
    Email : leminhphuoc89@gmail.com

  6. #6
    Ngày gia nhập
    05 2011
    Bài viết
    78

    Mặc định Phân trang trong winform - Paging in winform. Hướng dẫn chi tiết + Source code

    OK!
    Mình sẽ cải tiến và up bài trong thời gian nhanh nhất
    Thanks.

  7. #7
    Ngày gia nhập
    08 2009
    Nơi ở
    C:\Documents and Settings\ME\My Documents\Visual Studio 2010
    Bài viết
    516

    Phân trang trong Winform ít dùng hơn thôi chứ vấn đề này cũng bình thường. Cách làm như bạn lion080889 là cách làm thông dụng và hay nhất (theo kinh nghiệm của mình).

  8. #8
    Ngày gia nhập
    08 2011
    Nơi ở
    Yên Bái- Hà Nội
    Bài viết
    961

    thank mọi người đã chia sẻ. Nhân tiện cho mình hỏi chút. Mấy cái chiêu kiểu "độc" này bạn học ở đâu hay tài liệu nào thế?hihi. Mình tự học nên cái gì trong tài liệu mình đọc mà ko có là mỏi ngay.hix
    Skype: mrfour.it - Yahoo:mrfour_it
    Gmail: mrfour.it@gmail.com
    Bạn muốn học lập trình? Bạn chưa có kiến thức cơ bản? Bạn muốn học từ cơ bản tới nâng cao?... Bạn muốn có source code để tham khảo? Muốn có người hỗ trợ khi học?....http://www.laptrinh123.com sẽ giúp bạn những điều đó!

  9. #9
    Ngày gia nhập
    02 2010
    Bài viết
    52

    Trích dẫn Nguyên bản được gửi bởi mrfour.it Xem bài viết
    thank mọi người đã chia sẻ. Nhân tiện cho mình hỏi chút. Mấy cái chiêu kiểu "độc" này bạn học ở đâu hay tài liệu nào thế?hihi. Mình tự học nên cái gì trong tài liệu mình đọc mà ko có là mỏi ngay.hix
    học trung tâm đó bạn, nếu ở hcm thì nên vào trung tâm Hữu Khang, mình cũng học từ đó ra thầy giảng thêm ngoài lề rất nhiều (kinh nghiệm ấy) nhưng tài liệu bằng tiếng anh (cơ bản thôi)
    ai cũng tự học thôi, nhưng nếu có điều kiện thì nên đi học thêm trường lớp thì sẽ vững hơn nhiều
    Email : leminhphuoc89@gmail.com

  10. #10
    Ngày gia nhập
    04 2009
    Bài viết
    108

    Thank bạn, ý tưởng hay !!
    Ai đã gieo vào lòng Ai nỗi nhớ
    Để vì Ai sóng vỗ những đêm dài
    Ai có biết vì Ai-Ai không ngủ
    Trằn trọc hoài nỗi nhớ của riêng Ai.

Các đề tài tương tự

  1. Lấy dữ liệu từ một trang web trong winform
    Gửi bởi tuanvi261 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 31-03-2013, 11:42 AM
  2. Share source code Game caro viết trên C# Winform
    Gửi bởi playgun trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 11-09-2012, 05:39 PM
  3. Cách hiển thị thông tin chi tiết trong winform
    Gửi bởi nltt7777 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 27-07-2012, 07:36 PM
  4. Kỹ thuật C++ Winform C++ | Tạo module xử lý giao diện Winform trong C++ như thế nào?
    Gửi bởi likhungma trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 04-10-2011, 05:45 PM
  5. Tìm lỗi code trong WinForm?
    Gửi bởi hxechvn trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 23-05-2010, 12:00 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn