Showing posts with label product. Show all posts
Phân trang trong winform | Paging in winform
thuvienwinform - Phân trang thực ra là một đặc trưng trong lập trình web. Chia dữ liệu cần tải (load) ra làm nhiều phần nhỏ giúp việc hiển thị nhanh hơn (do dữ liệu tải về nhỏ hơn). Trong winform thì phân trang giúp cho sử dụng tài nguyên (cụ thể là RAM) ít hơn. Nhưng mình thử thì không giảm đi là bao :)), có lẽ do mình chưa giải phòng bộ nhớ tốt.
Sau đây mình xin giới thiệu với các bạn phân trang trong winform đằng LINQToSQL
Thư viện phân trang: https://www.dropbox.com/s/nj6fnuso2b2138p/ThuVienWinform.PhanTrang.dll (14KB)
Chương trình mẫu: https://www.dropbox.com/s/z9dvnbtceu3xv40/ThuVienWinform-PhanTrangLINQ.rar (710KB)
Nếu không tải được trên DropBox các bạn liên hệ trực tiếp thuvienwinform@gmail.com để mình gửi hoặc chạy Ultrasuft để truy cập lại DropBox
Trong chương trình mẫu có 2 tệp tin chứa cơ sở dữ liệu cho nó chạy các bạn nạp nó vào rồi sửa lại kết nối cho LINQ mới chạy được
Giới thiệu ThuVienWinform.PhanTrang:
- Với thư viện này sẽ không làm ảnh hưởng đến mã đã viết vì không cần thêm dòng code nào cả, chỉ việc khai báo và xài thui
- Khai báo:
phanTrang = new PhanTrangTruyenThong<tbPhanTrang>(this.db, this.bindingNavigator1, 20);Hoặc
PhanTrangTuyChinh<tbPhanTrang> pTrang = new PhanTrangTuyChinh<tbPhanTrang>(this.db, button1, comboBox1, button2, bindingNavigator1.BindingSource, 20);Trong đó:
+ tbPhanTrang là đối tượng cần phân trang, ở đây là một bảng tbPhanTrang trong CSDL
+ db là biến DataContext của LINQToSQL
+ bindingNavigator1: thanh điều hướng cho datagridView
+ 20: số hàng trên 1 trang
+ button1: là nút nhảy về trang sau
+ button2: là nút nhảy về trang trước
+ comboBox1: là comboBox để hiển thị các trang
+ bindingNagigator1.BindingSource là BindingSource của datagridView
- Chế độ:
+ PhanTrangTruyenThong: phân trang dựa vào bindingNavigator có sẵn, mình sẽ thêm 2 nút tiến lùi và 2 cái comboBox để hiển thị số trang lên đó
+ PhanTrangTuyChinh: truyền vào 2 nút và 1 comboBox có sẵn để làm 2 nút tiến lùi và hiển thị danh sách trang.
- Thuộc tính và sự kiện:
+ TrangHienTai: lấy về hoặc đặt trang hiện tại (set, get)
+ sự kiện NhayTrang: trả về hướng nhảy (tiến hoặc lùi) và số trang nhảy
- Mã phân trang bằng LINQ
/// <summary> /// Lấy dữ liệu từ chiSoDau đến chiSoCuoi /// </summary> /// <typeparam name="doiTuongCanPhanTrang">Đối tượng cần phân trang</typeparam> /// <param name="db">DataContext chứa dữ liệu cần phân trang</param> /// <param name="chiSoDau">Chỉ số đầu</param> /// <param name="chiSoCuoi">Chỉ số cuối</param> /// <returns></returns> public object DuLieuPhanTrang<doiTuongCanPhanTrang>(DataContext db, int chiSoDau, int chiSoCuoi) where doiTuongCanPhanTrang : class { try { var phanTrangs = (from p in db.GetTable<doiTuongCanPhanTrang>() select p).Skip(chiSoDau).Take(chiSoCuoi - chiSoDau); return phanTrangs; } catch { return null; } }
- Tư tưởng phân trang theo mình hiểu như sau: có một kho dữ liệu lớn (ví dụ 10 tỷ trường), ta không tải hết 10 tỷ trường đấy về để hiển thị lên dataGridView được (cháy máy mà chết mất). Nên phải chia nhỏ ra mỗi lần hiển thị 10 nghìn cái thôi!
- Có lỗi về thư viện hoặc ý tưởng mới về phân trang cùng nhau chia sẻ các bạn nha
- Chia sẻ mã ThuVienWinform.PhanTrang.dll quan hòm thư thuvienwinform@gmail.com nha!
CHAT LAN C#. Phần 3: Code máy khách (Client). Gửi, nhận dữ liệu với máy chủ
thuvienwinform - Sau khi đã có máy chủ thì chỉ việc tạo các máy khách kết nối đến máy chủ để giao tiếp với nhau thui. Sau khi tạo được kết nối thì máy khách sẽ gửi dữ liệu đến máy chủ và nhận dữ liệu truyền về! Đơn giản hơn code trên máy chủ rất nhiều.
Tải về project: https://www.dropbox.com/s/3moekk8knkge5s4/thuvienwinform-CHATLANClient.rar (18KB)
Yêu cầu:
- Kết nối chung mạng với máy cái ChatLanServer.
- Máy khách không cần Ip tĩnh
Cụ thể các bước xây dựng một máy khách như sau:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định (là ip tĩnh và cổng được tạo cho chương trình ChatLanServer trên máy chủ)
3/ Thực hiên giao tiếp với máy chủ
4/ Đóng kết nối
Các biến:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định
3/ Thực hiên giao tiếp với máy chủ
- Nhận dữ liệu: TcpClient.GetStream().Read
- Gửi dữ liệu: TcpClient.GetStream().Write
4/ Đóng kết nối
Thêm mô tả tìm kiếm và Liên kết cố định để SEO chuẩn :)
Nếu bạn mua IP tĩnh thì nó trở thành chat online là truyện bình thường :) cho máy cài IP tĩnh đó chạy chương trình server và các máy khách kết nối đến là được
19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Tải về project: https://www.dropbox.com/s/3moekk8knkge5s4/thuvienwinform-CHATLANClient.rar (18KB)
Yêu cầu:
- Kết nối chung mạng với máy cái ChatLanServer.
- Máy khách không cần Ip tĩnh
Cụ thể các bước xây dựng một máy khách như sau:
1/ Tạo luồng kết nối TcpClient
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định (là ip tĩnh và cổng được tạo cho chương trình ChatLanServer trên máy chủ)
3/ Thực hiên giao tiếp với máy chủ
4/ Đóng kết nối
Các biến:
//Địa chỉ mặc định string IP = "127.0.0.1"; int PORT = 100; //Các luồng Thread thKetNoiDenServer, thKetNoiTaoServer; //Biến dùng để gửi, nhận dữ liệu byte[] dlNhan = new byte[1024]; byte[] dlGui = new byte[1024]; TcpClient Khach;
1/ Tạo luồng kết nối TcpClient
Khach = new TcpClient();
2/ Kết nối đến máy chủ với địa chỉ ip và cổng xác định
Khach.Connect(IPAddress.Parse(IP), PORT);
3/ Thực hiên giao tiếp với máy chủ
- Nhận dữ liệu: TcpClient.GetStream().Read
string tmp = "";
byte[] dlNhan = new byte[1024]; Khach.GetStream().Read(dlNhan, 0, 1024); tmp = Encoding.Unicode.GetString(dlNhan);
- Gửi dữ liệu: TcpClient.GetStream().Write
byte[] dlGui = new byte[1024]; dlGui = Encoding.Unicode.GetBytes(txtGui.Text); Khach.GetStream().Write(dlGui, 0, dlGui.Length);
4/ Đóng kết nối
Thêm mô tả tìm kiếm và Liên kết cố định để SEO chuẩn :)
Khach.Close();
Nếu bạn mua IP tĩnh thì nó trở thành chat online là truyện bình thường :) cho máy cài IP tĩnh đó chạy chương trình server và các máy khách kết nối đến là được
19-5-2015:
Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
CHAT LAN C#. Phần 2: Code máy chủ (Server). Xử lí việc gửi nhận với nhiều máy khách
thuvienwinform - Để thực xây dựng chương trình gửi tin nhắn qua mạng LAN cần có một chương trình chạy trên máy chủ. Chức năng chính của nó là: Nhận kết nối từ các máy khách, sau khi tạo được kết nối thì bắt đầu việc gửi/nhận dữ liệu giữa máy chủ và máy khách. Khi nhận được dữ liệu (văn bản, hình ảnh, âm thanh,..) thì sẽ được xử lí trên máy chủ này. Có thể là lưu vào CSDL hoặc thực hiện các lệnh nhận được từ máy khách như gửi cho họ một tài liệu, hình ảnh, đoạn phim,...
Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)
Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html
Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket
- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.
- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html
Các biến:
1/ Tạo (mở) một cổng kết nối logic (socket)
Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
với List cacMay = new List();
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:
3/ Thực hiên giao tiếp với máy khách
- Nhận văn bản gửi đến lưu vào biến tạm tmp
- Gửi văn bản đến các máy khách:
Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket
Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)
Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html
Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket
- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.
- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html
Các biến:
//Địa chỉ mặc định string IP = "127.0.0.1"; int PORT = 100; //Các luồng Thread thKetNoiDenServer, thKetNoiTaoServer, thLienLacKhach; TcpListener langNghe; //Biến dùng để gửi, nhận dữ liệu byte[] dlNhan = new byte[1024]; byte[] dlGui = new byte[1024]; //Socket tạo server và kết nối Socket socket; //Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Danh sách các máy khách kết nối đến ListcacMay = new List ();
1/ Tạo (mở) một cổng kết nối logic (socket)
//Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IP), PORT);//IP = "127.0.0.1"; PORT = 100; //Liên kết cổng s với địa chỉ IP và cổng s.Bind(iep); //Nhận tín hiệu từ các máy kết nối s.Listen(10);
Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
//Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket);
với List
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:
//Trong khi còn kết nối. Mỗi khi có tín hiệu từ máy khách đến sẽ thêm vào -> nhận đc nhiều máy khách cùng lúc
while (true) { //Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket); }
3/ Thực hiên giao tiếp với máy khách
- Nhận văn bản gửi đến lưu vào biến tạm tmp
string tmp = "";
byte[] dlNhan = new byte[1024]; socket.Receive(dlNhan); tmp = Encoding.Unicode.GetString(dlNhan);
- Gửi văn bản đến các máy khách:
foreach (Socket s in cacMay) { s.Send(Encoding.Unicode.GetBytes(noiDung)); }
Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket
Khach.Close();
Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!