Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 3 123 CuốiCuối
Kết quả 1 đến 10 của 22
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TheHalfHeart
    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 [IMG]images/smilies/smile.png[/IMG] 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 [IMG]images/smilies/smile.png[/IMG]
    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 [IMG]images/smilies/smile.png[/IMG]

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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

    Mã:
            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

    Mã:
            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

    Mã:
            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

    Mã:
            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...)

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Chưa test nhưng ý tưởng rất hay. cám ơn bác

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thanks bạn đã có ý kiến [IMG]images/smilies/biggrin.png[/IMG].
    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 tham gia
    Sep 2015
    Bài viết
    0
    OK! [IMG]images/smilies/biggrin.png[/IMG]
    Mình sẽ cải tiến và up bài trong thời gian nhanh nhất
    Thanks.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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).

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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é:
    Mã:
    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 [IMG]images/smilies/biggrin.png[/IMG] ) 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 [IMG]images/smilies/smile.png[/IMG]

    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é [IMG]images/smilies/smile.png[/IMG]

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    [IMG]images/smilies/biggrin.png[/IMG]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

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi mrfour.it
    [IMG]images/smilies/biggrin.png[/IMG]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 [IMG]images/smilies/smile.png[/IMG] 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 [IMG]images/smilies/smile.png[/IMG]

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thank bạn, ý tưởng hay !!

 

 
Trang 1 của 3 123 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •