Archive for 2013

Hướng dẫn sửa lỗi "The DELETE statement conflicted with the REFERENCE constraint "FK_...""


thuvienwinform - Đây là lỗi bị xung đột khóa ngoài khi xóa 1 bản ghi trong quan hệ  1-1 Sau đây mình xin hướng dẫn 1 cách sửa lỗi này. Cách sửa như sau: Ta sẽ xóa 1 bảng trong quan hệ 1-1 này đi, tất nhiên là phải backup nội dung của bảng trước rồi mới xóa. Sau khi xóa xong ta tạo lại bảng này và khôi phục nó!

B1: Trong Visual Studio showdata bảng cần backup -> chuột phải bảng cần backup -> show table data -> ấn nút script

-> được đoạn code:


OK để đó đã

B2: 

Sau đó copy đoạn code nhận đc:


B3: copy code B2 paste thêm vào đoạn code ở B1:


B4: Bây giờ có thể xóa bảng đó đi rùi


B5:
Ấn nút Execute (CS+E) trong tab chứa code ở B3



Vậy là bảng đã quay trở lại và cái quan hệ 1-1 đó cũng đã bị xóa! Chúc các bạn thành công

12/31/2013
Đăng bởi :
Nhãn :

Code Smells (Code bốc mùi)

Code smells là một thuật ngữ rất phổ biến đối với các lập trình viên, vậy nó là gì, tại sao chúng ta phải quan tâm đến code smells, và tại sao phải hạn chế code smell bên trong mã lệnh của bạn? Hy vọng bài viết này sẽ giải đáp được phần nào cho các bạn mới làm quen với thế giới lập trình.
Theo Wikipedia, Code smells (code mà bốc mùi, hoặc có mùi lạ trong code) là bất kỳ triệu chứng bất ổn nào bên trong mã nguồn của một chương trình, mà vì nó có thể sẽ dẫn đến các vấn đề lớn hơn. Code smells không phải là bugs (lỗi lập trình), nghĩa là chúng không làm sai chứ năng của ứng dụng. Thay vào đó, chúng là biểu hiện của sự yếu kém trong thiết kế và sẽ làm cho quá trình phát triển ứng dụng bị chậm lại hoặc tăng nguy cơ của bugs hoặc lỗi trong tương lai.
Sau đây mình xin liệt kê các loại code smells mà bạn có thể gặp:

Code smells bên trong class

Comments (ghi chú): không nên sử dụng comment tùy tiện, bạn nên comment khi thực sự cần thiết. Một comment phải giải thích được "tại sao", chứ không phải là "cái gì". Bạn có thể cải tiến mã lệnh để không cần phải dùng comment được không? Khi đó tự mã lệnh giải thích cho nó mà không cần đến comment. Và lưu ý rằng, comment phải dễ hiểu, bởi nó dành cho con người, không phải để dành cho máy.
Long method (Phương thức có độ dài lớn): Phương thức ngắn thì dễ đọc, dễ hiểu và dễ xử lý khi có lỗi xảy ra hơn. Hãy cố gắng chia tách những phương thức dài thành những phương thức nhỏ hơn khi bạn có thể.
Long parameter list (quá nhiều tham số cho một phương thức): Phương thức càng nhiều tham số, nó càng phức tạp. Hãy hạn chế số lượng tham số cho một phương thức, hoặc bạn cần phải sử dụng một đối tượng chứa các tham số đó.
Conditional complexity (độ phức tạp của các lệnh điều kiện): hãy cẩn thận với các khối lệnh điều kiện lớn, vì chúng thường sẽ phình to theo thời gian, bạn có thể tìm kiếm các cách khác theo lập trình hướng đối tượng để thay thế như các mẫu decorator, strategy, hoặc state.
Combinitorial explosion: bạn có rất nhiều mã lệnh thực hiện phần lớn các công việc gần giống như nhau, nhưng chỉ khác nhau một xiu về dữ liệu hoặc hành vi. Trường hợp này không dễ để cải thiện, tuy nhiên, bạn có thể thử dùng generics hoặc interpreter.
Large class (lớp có lượng mã lệnh rất lớn): các lớp có lượng mã lệnh lớn thường khó để đọc và hiểu. Liệu lớp bạn xây dựng có đảm trách nhiều vai trò quá không? Nếu vậy, bạn nên tái cấu trúc lớp đó thành nhiều lớp nhỏ hơn.
Type embedded in name (tên phương thức có chứa tên kiểu dữ liệu trả về): Nếu phương thức của bạn có tên chứa tên kiểu dữ liệu trả về, bạn nên sửa lại, bởi vì khi bạn thay đổi kiểu dữ liệu trả về, bạn phải thay đổi tên của phương thức.
Uncommunicative name (tên lạ, tên khó hiểu): Đây là trường hợp tên của phương thức không diễn tả được mục đích của phương thức, và tên khó đọc. Bạn nên đổi tên các phương thức kiểu như vậy.
Inconsistent names (cách đặt tên không nhất quán): bạn nên thống nhất cách đặt tên nhất quá cho các phương thức. Ví dụ nếu bạn có phương thức Open(), bạn nên có phương thức Close().
Dead code (mã lệnh không sử dụng): Hãy xóa các mã lệnh không còn sử dụng. Nếu bạn lo rằng tới một ngày kia bạn sẽ cần phải sử dụng nó, bạn đừng lo, bởi nếu có sử dụng các công cụ Version Controls, chúng sẽ lưu lại các phiên bản cũ cho bạn.
Speculative generality: hãy viết code để giải quyết vấn đề hiện tại, và chỉ quan tâm đến các vấn đề tương lai nếu chúng thực sự cần thiết, nếu không hãy bỏ qua. Bạn cần tuân thủ nguyên tắc YAGNI (You Ain’t Gonna Need It). Tôi sẽ sớm có bài viết về YAGNI.
Oddball Solution (inconsistent solution – giải pháp không nhất quán): Bạn chỉ nên dùng một cách duy nhất để xử lý một vấn đề bên trong mã lệnh của bạn nếu không bạn đã mắc phải code smell Oddball Solution.
Temporary Field (trường tạm): Đừng để quá nhiều trường tạm, không cần thiết trong mã cài đặt các đối tượng của bạn.

Code smells giữa các class với nhau

Các class tương tự nhau nhưng bề ngoài khác nhau: Nếu hai lớp giống nhau bên trong, nhưng lại khác nhau ở bên ngoài, thì bạn nên sửa chúng để chúng cùng chung một interface.
Primitive Obsession (nỗi ám ảnh về kiểu dữ liệu nguyên thủy): đối với những người mới làm quen với lập trình hướng đối tượng, đôi khi họ lưu những thông tin của đối tượng bên trong đối tượng khác bằng cách sử dụng các kiểu primitive. Nếu dữ liệu đủ phức tạp, bạn nên sử dụng một lớp để thể hiện nó.
Data class: các lớp dữ liệu, có chứa các trường lưu dữ liệu, các getters và setters, nhưng ngoài ra không còn gì cả. Code smell ở đây là các lớp này chỉ chứa dữ liệu và được khởi tạo một cách quá chi tiết bởi các lớp khác. Cần phải đảm bảo tính đóng gói của các lớp này.
Data clumps: Nếu bạn thấy các phần tử dữ liệu hay đi kèm với nhau tại nhiều nơi, ví dụ như các trường bên trong một vài lớp, là tham số của nhiều phương thức, bạn nên gộp chúng lại thành đối tượng.
Refused Bequest: Bạn sử dụng kế thừa, nhưng lại hầu như không sử dụng các phương thức được kết thừa, vậy liệu có nên sử dụng kế thừa không?
Inappropriate Intimacy: Các lớp không nên xử liệu quá nhiều công việc của nhau. Các lớp nên biết về nhau càng ít càng tốt.
Indecent Exposure: Các lớp không nên "show" quá nhiều nội tình bên trong nó. Khi bạn công khai một trường hoặc một phương thức của một class, bạn cần phải có lý do thực sự hợp lý, nếu không, hãy giấu chúng đi.
Feature Envy: Đây là trường hợp một lớp có một phương thức được sử dụng nhiều hơn bởi lớp khác hơn là chính lớp đó. Nếu trường hợp như vậy xảy ra, bạn nên di chuyển phương thức đó sang lớp kia.
Lazy Class (lớp lười nhác): Không nên tồn tại những lớp không thực hiện việc gì cả. Việc có càng nhiều lớp, sẽ càng làm phức tạp cho dự án của bạn. Nếu một lớp được sinh ra chả để làm gì cả, bạn có thể nghĩ đến việc xóa nó, hoặc hợp nó với một lớp khác.
Message Chains (chuỗi thông điệp): Có những trường hợp, code của bạn gọi mỗi chuỗi các phương thức từ các đối tượng để lấy dữ liệu nào đó, ví như var ().getAnotherThing().getAnotherThing2….
Middle Man (lớp trung gian): nếu một lớp trung gian chỉ có mặt để truyền lời gọi đến các lớp khác, thì lớp đó không nên tồn tại.
Divergent Change: nếu bạn đổi một phần này của lớp và kéo theo phải đổi các phần khác của lớp, thì có thể nó đang mang trong mình nhiều thứ không liên qua. Hãy nghĩ đến việc cô lập các phần có thể gây ảnh hưởng và chuyển qua một lớp khác.
Shotgun Surgery: Nếu thay đổi của một lớp gây sự thay đổi đến nhiều lớp khác, thì bạn nên nghĩ đến việc cải tổ code để hạn chế sự thay đổi chỉ ảnh hưởng đến bên trong lớp đó.
Parallel inheritance hierarchies: code smell này là hiện tượng khi bạn thêm một lớp con của một lớp này, thì bạn cũng phải tạo thêm lớp con của một lớp khác.
Incomplete Library Class: đây là code smell khi chúng ta cần thêm một phương thức vào một lớp trong thư viện, nhưng chúng ta không thể thay đổi thư viện để thêm phương thức đó vào.
Solution Sprawl: để thực hiện một việc gì đó, bạn cần quá nhiều các lớp khác nhau tham gia (trên 5 lớp), thì đó là dấu hiệu của code smell Solution Sprawl. Hãy nghĩ tới việc đơn giản hóa thiết kế của bạn.

Lời kết

Bài viết về code smells này chỉ mang tính chất giới thiệu sơ đẳng, và do thời gian có hạn nên bài viết chưa lý giải được hoàn toàn rõ ràng về các code smells, và cách thức xử l

Nguồn: hocchoi.com
12/30/2013
Đăng bởi :
Nhãn :

Hướng dẫn sửa lỗi "Unable to access T-SQL components" trong Visual Studio 2012


thuvienwinform - Lỗi này gặp phải khi ta update SQL Server! Nó làm ta không xem đc CSDL trực tiếp trong Visual Studio (VS). Dấu hiệu như sau: khi ấn hiện thị CSDL bằng VS thì nó xuất hiện thông báo như trên kia và hộp thoại thứ 2 là "An incompatible DacFx version is installed" Cách sửa khá đơn giản, bạn chỉ cẩn tải về 2 bản update sau:


Sau khi cài 2 bản update này sẽ có thể mở CSDL trực tiếp trong VS.



Gợi ý code lấy địa chỉ IP người khác

- Mình không khuyến khích các bạn dùng địa chỉ IP làm việc xấu nhé (vì mình cũng không biết hậu quả của việc biết địa chỉ IP người khác :V)
- Yêu cầu: có 1 database online (đăng kí tại somee.com) xem hướng dẫn tại đây
- Thế này: ta xây thêm vào form 1 cái webrowser (wb) và ẩn nó đi, cho cái wb này chỉ đến địa chỉ  http://whatismyipaddress.com/. Thêm cho wb này sự kiện docmentcomplete là khi load xong trang xem ip kia thì Insert mã nguồn (DocumentText) của wb lên database. Sau đó ta lấy dữ liệu nhận đc từ database có phải là đã có IP của nạn nhân
- Về cái form thì thêm cho nó một số chức năng giải trí như game flash nào đó hoặc một mầu truyện cười (vì trang xem IP khoảng 10s là load xong, Nếu không thì đặt sự kiện FormClose thành Hide là được)
- Chỉ là gợi ý thui, mình không code cụ thể nhé! Và không chịu hậu quả hâu ra :V. Cái này chỉ là kết nối mạng nên không bị diệt virus phát hiện
12/01/2013
Đăng bởi :
Nhãn :

API là gì? Ứng dụng của nó như thế nào?


thuvienwinform - Đơn giản như thế này, hiện nay nhiều người dùng mạng xã hội facebook và bạn muốn viết một ứng dụng để đăng tin lên mạng xã hội này. Vậy làm sao để làm một ứng dụng như vậy khi facebook là của người khác? Hiểu được nhu cầu này của các lập trình viên facebook sẽ đưa ra các thư viện chứa các hàm đăng, like, share...trên trang của mình để các lập trình viên khai thác! Đó chính là API
Google+, Gmail, Blogger, Youtube, các ứng dụng của windows (Windows media player, Internet Explorer,..), nhaccuatui, zingmp3,...rất nhiều các trang web, ứng dụng đưa ra các API để hỗ trợ các lập trình viên

- API (Application Programming Interface - Giao diện lập trình ứng dụng). Mỗi hệ điều hành, ứng dụng đều có những bộ API khác nhau. Nó cung cấp cho người lập trình các hàm tương tác với CSDL, lập trình thực hiện các thao tác với hđh hay phần mềm đó. Hầu hết các hàm API được chứa trong các file DLL
- Ví dụ: Các hàm API của hđh windows cho phép chúng ta lập trình ứng dụng thay đổi icon màn hình, xem thông tin máy tính, ... hay các hàm API của google cho phép lập trình viên lấy thông tin, sửa thông tin người dùng,...Các hàm API của facebook cho chúng ta đăng stt, ảnh, cmt,...
- Vậy API có phải một ngôn ngữ lập trình không? Câu trả lời là không các bạn ạ. Các hàm API cũng như các hàm bình thường mà chúng ta hay viết và trên từng ngôn ngữ khác nhau cũng có các bộ API tương ứng khác nhau.
- Ví dụ: Google API có bộ cho .NET, PHP,..
- Và mỗi bộ API hầu như đều có hướng dẫn sử dụng rất cụ thể và chi tiết. Ví dụ của hướng dẫn sử dụng các hàm API đối với blogger: https://developers.google.com/blogger/docs/2.0/developers_guide_dotnet rất hữu ích cho ai muốn viết ứng dụng quản lí blog


- Ví dụ một đoạn code đăng bài cho blog sử dụng API của google:

void DangBai(Service service, string bID, string title, string content, bool isDraft)
        {
            //Tạo các thuộc tính của bài đăng
            Uri blogPostUri = new Uri("http://www.blogger.com/feeds/" + bID + "/posts/default");
            AtomEntry newPost = null;
            newPost = new AtomEntry();
            newPost.IsDraft = isDraft;
            newPost.Title.Text = title;

            newPost.Content = new AtomContent();
            newPost.Content.Content = content;
            newPost.Content.Type = "html";
            newPost.Updated = new DateTime(2011, 1, 1, 10, 0, 0);
            newPost.Published = new DateTime(2011, 1, 1, 10, 0, 0);
            //Đăng bài
            AtomEntry CreateEntry = service.Insert(blogPostUri, newPost);
        }

Một số bài về API:
- Phát nhạc: http://thuvienwinform.blogspot.com/2014/04/api-phat-nhac-mp3_13.html
- Kiểm tra kết nối mạng: http://thuvienwinform.blogspot.com/2014/04/api-kiem-tra-ket-noi-internet.html
- Facebook API: http://facebooksdk.net/
- Google API: https://code.google.com/p/google-api-dotnet-client/wiki/APIs
+ Hướng dẫn A-Z Google API cho Blogspot: http://garyngzhongbo.blogspot.com/2013/10/bloggerc-blogger-api-v31.html
- Tìm trên nhaccuatui: http://diendan.congdongcviet.com/threads/t57486::lay-link-nhac-an-tu-trang-nhaccuatui-com.cpp

11/27/2013
Đăng bởi :
Nhãn : ,

Code lấy thông tin máy tính bằng C# (Tên máy, tài khoản người dùng, phiên bản hệ điều hành, địa chỉ MAC,...)



Code lấy tên máy, phiên bản HĐH, địa chỉ IP, địa chỉ MAC bằng C#

- Demo: https://www.dropbox.com/s/8xw85oo6xg8v86c/ThongTinHeDieuHanh.rar (52KB)
- Để lấy thông tin cơ bản như tên máy, tài khoản đăng nhập vào máy, phiên bản hệ điều hành ta sử đụng lớp Environment sẵn có để lấy những thông tin đó. Ví dụ: Environment.MachineName để lấy tên máy, Environment.UserName để lấy tài khoản đăng nhập vào máy,...

- Để lấy các địa chỉ IP mà máy đang có (Đang kết nối đến bao nhiêu mạng thì có bằng đó IP): http://www.thuvienwinform.tk/2013/10/code-lay-username-va-ip-cua-may.html

- Để lấy địa chỉ MAC ta sử dụng thêm using System.Net.NetworkInfomation;
Code lấy địa chỉ MAC như sau: (cảm ơn anh LNT đã share cho mình code này)

            /////////////////
            //Lấy địa chỉ MAC
            ////////////////  
            string DanhSachMAC = "";
            NetworkInterface[] DanhSachCardMang = NetworkInterface.GetAllNetworkInterfaces();
            for (int i = 0; i < DanhSachCardMang.Length; i++)
            {
                PhysicalAddress DiaChiMAC = DanhSachCardMang[i].GetPhysicalAddress();
                DanhSachMAC += DanhSachCardMang[i].Name + " : ";
                byte[] ByteDiaChi = DiaChiMAC.GetAddressBytes();
                for (int j = 0; j < ByteDiaChi.Length; j++)
                {
                    DanhSachMAC += ByteDiaChi[j].ToString("X2");
                    if (j != ByteDiaChi.Length - 1)
                    {
                        DanhSachMAC += "-";
                    }
                }
                DanhSachMAC += "\r\n";
                txtMAC.Text += DanhSachMAC;
            }

hoặc

            /////////////////
            //Lấy địa chỉ MAC
            ////////////////
            int l, i, j=0;
            string MAC;
            while (true)
            {
                try
                {
                    MAC = NetworkInterface.GetAllNetworkInterfaces()[j].GetPhysicalAddress().ToString(); //đến đây đã lấy được địa chỉ rồi nhưng chưa có dấu phân cách
                    l = MAC.Length - 1;
                    for (i = 0; i <= l; i++)
                    {
                        if (i % 2 == 0 && i != 0) txtMAC.Text += "-";
                        txtMAC.Text += MAC[i];
                    }
                    j++;
                    txtMAC.Text += "\r\n";
                }
                catch
                {
                    break;//Hết địa chỉ MAC rồi thì ngắt vòng lặp
                }
            }
Với cách 2 chạy lâu hơn rất nhiều :) khuyến cáo không nên dùng.

11/20/2013
Đăng bởi :
Nhãn :

Chương trình Notepad đơn giản



Notepad winform C#

Tải về: https://www.dropbox.com/s/hzdykk706v5p4jr/Notepad-thuvienwinform.rar (74KB)

Chức năng: tạo mới, sửa, lưu file. Có thể mở nhiều cửa sổ cha và con (tham khảo tại đây)

Trên một số diễn đàn họ sử dụng Rich TextBox nhưng không hay lắm vì nó không đọc được các file text bình thường, ở đây mình dùng textBox để hiển thị dữ liệu

Mình share mã nguồn luôn bạn nào có hứng thì thêm chức năng Undo, Print nữa nhé.
10/27/2013
Đăng bởi :
Nhãn :

MDI Parent Form tạo form nhiều form con

Form cha form con
Hướng dẫn sử dụng MDI Parent Form

- Chức năng chính của item này là tạo ra một form có sẵn tính năng gọi ra một form khác (form con) nằm trong form chính


Để thêm 1 MDI Parent Form ta làm như sau:

Project -> Add windows Form... -> MDI Parent Form




Sau đó ta thêm 1 Form để làm Form con (thực ra sau khi thêm MDI Parent Form thì nó đã có thể gọi ra form con rồi nhưng trên form đó không có gì cả, nên ta cần thêm form này)
Project -> Add windows Form... -> Windows Form


Code để gọi ra form con nằm trong form cha:


private void New(string Title)
{
    Form childForm = new FormCon();
    childForm.MdiParent = this;//Đặt form cha cho childForm là form này
    childForm.Text = Title;//Tile cho childForm
    childForm.Show();//Hiển thị nó lên
}

OK nó còn có sắn các menu như copy, paste, print để các bạn tự tìm hiểu nha
Chúc có nhưng chương trình hay với MDI Parent ^^!
Đăng bởi :
Nhãn :

Code lấy Username và IP của máy

Form  hiển thị ra user name và các IP của máy

Demo: https://www.dropbox.com/s/z2bavemx6i83812/LayIp-Username-C%23-thuvienwinform.rar (46KB)

Để thực hiện công việc này ta sử dụng thư viện System.Net; (using System.Net;)

Để lấy user name ta dùng code:

string username = Dns.GetHostName();//kiểu string luôn

Để lấy địa chỉ Ip ta dùng code:

IPHostEntry Ip = new IPHostEntry();
Ip = Dns.GetHostByName(HostName);
foreach (IPAddress ip in Ip.AddressList)
{
    txtIp.Text = txtIp.Text + ip.ToString() + "\r\n";
}

Ứng dụng thông tin vào nhiều việc khác nhau ví dụ như tạo biểu mẫu theo dõi phần mềm (đồng bộ qua database), ứng dụng trong mạng LAN,...
Chúc các bạn thành công!
10/26/2013
Đăng bởi :
Nhãn :

Tạo Form Download bằng C# | Form tải về


Form Download
Demo: https://www.dropbox.com/s/2gdx3xb93fqbtzv/DownLoadBangC%23-thuvienwinform.rar

Để thực hiện công việc này ta phải sử dụng đến thư viện System.Net; -> hỗ trợ toàn bộ các bạn .NET
Cú pháp như sau:


WebClient Wc = new WebClient();//Khai báo biến webclient để thực hiện tải về
Uri FileUrl = new Uri(txtUrl.Text.Trim());//Uri để tạo đầu vào cho Wc tải về, Trim để xóa kí tự rỗng ở 2 đầu
Wc.DownloadFileAsync(FileUrl, txtSaveFile.Text);//Bắt đầu tải về Cú pháp: TênBiếnWebclient.DownloadFileAsync(Uri chứa đường dẫn tải về, Địa điểm lưu file)

Code chương trình:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;//thư viện cần thiết để tạo download

namespace DownLoad
{
    public partial class Form1 : Form
    {
        string FileSave;//biến chứa đường dẫn lưu files
        WebClient Wc = new WebClient();//Khai báo biến webclient để thực hiện tải về
        public Form1()
        {
            InitializeComponent();
        }

        private void Save_File()//chọn đường dẫn lưu file
        {
            SaveFileDialog saveDial = new SaveFileDialog();//Hộp thoại tạo file lưu trữ
            saveDial.Title = "Lưu file";//tên hộp thoại
            saveDial.Filter = "Tất cả|*.*";//Định dạnh file lưu
            if (saveDial.ShowDialog() != System.Windows.Forms.DialogResult.Cancel)//Nếu không ấn hủy thì sẽ lấy đường dẫn lưu file
                FileSave = saveDial.FileName;//Lấy đường dẫn để lưu file
            txtSaveFile.Text = FileSave;//Xuất đường dẫn ra textbox
        }

        private void btBrower_Click(object sender, EventArgs e)//Sự kiện ấn nút chọn đường dẫn lưu file
        {
            Save_File();
        }

        private void btStartDownLoad_Click(object sender, EventArgs e)
        {
            Wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Wc_DownloadProgressChange);//Hiển thị phần trăm tải về bằng progressBar
            Uri FileUrl = new Uri(txtUrl.Text.Trim());//Uri để tạo đầu vào cho Wc tải về, Trim để xóa kí tự rỗng ở 2 đầu
            if (txtSaveFile.Text == "" || txtSaveFile.Text == null)//Nếu chưa chọn đường dẫn để lưu thì phải chọn xong mới tải
                Save_File();
            else//Nếu đã chọn đường dẫn lưu file thì bắt đầu tải
                Wc.DownloadFileAsync(FileUrl, txtSaveFile.Text);//Bắt đầu tải về Cú pháp: TênBiếnWebclient.DownloadFileAsync(Uri chứa đường dẫn tải về, Địa điểm lưu file)
        }

        void Wc_DownloadProgressChange(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;//Gán phần trăm tải về vào ProgressBar
            lbPercent.Text = progressBar1.Value.ToString() + "%";
        }
    }
}
ấn F5 -> điền dữ liệu vào form và ấn bắt đầu:
VD:
+ Đường dẫn: https://lh5.googleusercontent.com/-4KAQJWN3Zl8/Ulo8Bj6G3EI/AAAAAAAAACc/uwklKtW1GHA/w499-h300-no/Microsoft-Visual-Studio-2012.png
+ Lưu vào: D:\a.png


Đăng bởi :
Nhãn :

Chương trình tự động cuộn trang. Hỗ trợ kết bạn facebook nhanh!



Chương trình tự động cuộn trang hỗ trợ kết bạn facebook

Tải về: https://www.dropbox.com/s/p4op8ah9vjm87yr/TuDongCuonTrang-HoTroKetBanNhanhFacebook.exe (25KB)
AutoClick: https://www.dropbox.com/s/4tteivvcpsh2qc7/AutoClick%202.2.rar (80KB)
Nếu kết hợp chúng lại ta sẽ có phần mềm tự động kết bạn facebook

Hướng dẫn
Cách sử dụng: nó là 1 combo, đầu tiên bạn bật chương trình tự động cuộn trang lên, sau đó bật autoclick lên. Tiếp theo ấn nút bật trong chương trình tự động cuộn trang di chuột vào nút "Xác nhận" ấn F3 thế là có phần mềm tự động kết bạn facebook

Chúc các bạn có nhiều bạn bè!
10/25/2013
Đăng bởi :
Nhãn :

Chương trình quản lí file đơn giản




Vì sử dụng thêm SQLite nên có thể sẽ không chạy đc trên tất cả các máy! 

Chương trình vẫn còn rất sơ sàim chỉ mang tình chất tham khảo, ứng dụng của SQLite, nếu bạn nào có nhu cầu lấy mã nguồn thì liên hệ mình nhé, thuvienwinform@gmail.com

Chức năng chính là quản lí các file, thư mục với tên tùy chình đề dễ tìm và quản lí file thôi. Nhưng có thêm phần mô tả để giúp bạn gợi nhớ lại lược sử hoặc nguồn gốc của file đó@! Rất hữu ích với những file lâu năm đó! Chương trình chỉ hỗ trợ 500 item nếu muốn thêm thì bạn coppy file QuanLiFile trong thư ổ cài xong cut nó ra ngoài! Sau đó cài lại
Đăng bởi :
Nhãn :

Lấy kích cỡ của 1 file bằng C#

Để lấy kích cỡ của 1 file ta dùng code sau:

FileInfo f_info = new FileInfo("Đường dẫn file");
int FileLength = f_info.Length;//ĐƠn vị Byte
Ví dụ:
FileInfo f_info = new FileInfo("C:\\a.png");
int FileLength = f_info.Length;//biến FileLength sẽ chứa kích thước của file

Với code này ta cũng có thể tính được kích cỡ của Folder bằng cách tính tổng kích thước các file, nhưng nếu trong folder mà lại có folder nữa thì sẽ bị sai
10/23/2013
Đăng bởi :
Nhãn :

Lấy Icon của file, thư mục bằng C#


Hướng dẫn lấy Icon của file, thư mục xuất ra listview
Demo: https://www.dropbox.com/s/s3q3lrrfhdygvci/LayIconFile-thuvienwinform.rar

Bước 1: Tạo 1 project
Bước 2: Tạo 1 Class với code sau: (chú ý thay tên project của bạn vào nhé)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;//
namespace tên_project_của_bạn
{
    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEINFO
    {
        public IntPtr hIcon;
        public IntPtr iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szTypeName;
    };
    class SpyIcon
    {
        public const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
        public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon

        [DllImport("shell32.dll")]
        public static extern IntPtr SHGetFileInfo(string pszPath,
                                    uint dwFileAttributes,
                                    ref SHFILEINFO psfi,
                                    uint cbSizeFileInfo,
                                    uint uFlags);
        public static System.Drawing.Icon GetIcon(string path)
        {
            SHFILEINFO sinfo = new SHFILEINFO();
            IntPtr iconHwnd = SHGetFileInfo(path, 0, ref sinfo, (uint)Marshal.SizeOf(sinfo), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SMALLICON);
            return System.Drawing.Icon.FromHandle(sinfo.hIcon);
        }
    }
}

Bước 3: Form chính như sau: (chú ý cài đặt trong các khung đỏ)




Bước 4: Code cho Form chính:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace LayIconFile
{
    public partial class Form1 : Form
    {
        int k = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void listView1_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;//hiệu ứng con chuột
        }

        private void listView1_DragDrop(object sender, DragEventArgs e)
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);//Lấy những đường dẫn file được kéo vào
            string fi;
            foreach (string filename in files)
            {
                imageList1.Images.Add(k.ToString(), SpyIcon.GetIcon(filename)); //Thêm icon cho imagelist
                fi = filename.Substring(Directory.GetParent(filename).ToString().Length + 1);//Lấy tên file
                //imageList1.Images.Add(i.ToString(), Image.FromFile(files[i])); //Cách 2
                ListViewItem item = new ListViewItem(fi, k);//Tạo item mới
                item.Tag = filename;//Đánh dấu đường dẫn file cho item
                listView1.Items.Add(item);//Thêm item vào listview
                k++;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Icon ic = SpyIcon.GetIcon(@"D:\isic.jpg");
            Bitmap bit = ic.ToBitmap();
            bit.Save(@"C:\icon.ico", System.Drawing.Imaging.ImageFormat.Icon);
        }

        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start(listView1.SelectedItems[0].Tag.ToString());
            textBox1.Text = listView1.SelectedItems[0].Tag.ToString();
        }
    }
}

Bước 5: ấn F5 rồi kéo thả vào xem sao
10/22/2013
Đăng bởi :
Nhãn :

Đóng gói bản cài chương trình winform


Khi ta viết xong 1 chương trình tốt nhất ta nên đóng gói lại thành bản cài với các database, file dll đầy đủ, để thực hiện được công việc này ta sử dụng project Setup and Deployment. Yêu cầu cần cài đặt InstallShield

I. Hướng dẫn tải và lấy key InstallShield
- vào link: http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?lang=1033&ver=ult


- Điền đầy đủ thông tin sau đó ấn Download Now


- Lưu key lại vào chọn 1 trong 2 bản để tải về sau đó tiến hành cài đặt
- Sau khi cài đặt xong bạn thoát Visual ra sau đó vào lại visual sẽ thấy InstallShield xuất hiện và yêu cầu nhập key hoặc dùng thử, ta nhập key vào. thế là xong phần cài đặt

II. Đóng gói
Xem video: http://www.youtube.com/watch?v=4rsspP-Yfn4

hoặc


10/16/2013
Đăng bởi :
Nhãn :

Lấy tạo độ của con chuột trên form

Để thực hiện công viện này ta sử bắt sự kiện Mouse Move của Form.

Giá trị trả về của sự kiện là: e.X tọa độ x, e.Y: tọa độ y

ứng dụng có thể kết hợp draw để tạo thêm chút hiệu ứng

Lấy tọa độ của Form: https://www.dropbox.com/s/fck3n5srv9ibzs5/LayToaDoCuaChuotTrongFrom-thuvienwinform.rar

Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//
//
// Chú ý: ở properties của form chọn DoubleBuffered là true để đỡ lag!
//
//

namespace LayToaDoCuaChuotTrongFrom
{
    public partial class Form1 : Form
    {
        Graphics paper;
        Pen pen = new Pen(Color.Brown);
        Point p = new Point();
        public Form1()
        {
            InitializeComponent();
        }

        private void DrawLine(Graphics paper)
        {
            paper.DrawLine(pen, new Point(0, 0), p);
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            textBox1.Text = e.X.ToString();
            textBox2.Text = e.Y.ToString();

            label1.Text = e.X.ToString();
            label2.Text = e.Y.ToString();

            label1.Location = new Point(e.X - 10, e.Y + 10);
            label2.Location = new Point(e.X + 10, e.Y - 10);

            p.X = e.X;
            p.Y = e.Y;

            this.Invalidate(); //Vẽ lại các phần tử             
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            paper = e.Graphics;
            DrawLine(paper);
        }
    }
}

10/15/2013
Đăng bởi :
Nhãn :

Hàm Random() lấy số ngẫu nhiên trong C#

Để lấy một số ngẫu nhiên ta dùng lớp Random()

Cú pháp:

Random TenBienRanDom = new Random();
TenBienRandom.Next(GiaTriDau, GiaTriCuoi);//Trả về giá trị kiểu int

Ví dụ:

int Numrd;
string Numrd_str;
Random rd = new Random();
Numrd = rd.Next(1, 100);//biến Numrd sẽ nhận có giá trị ngẫu nhiên trong khoảng 1 đến 100
Numrd_str = rd.Next(1, 100).ToString();//Chuyển giá trị ramdon về kiểu string

Ứng dụng:
- Lấy ngẫu nhiêu một chữ trong bảng chữ cái:

Random rd = new Random();
string TextRd;
TextRd = Convert.ToString((char)rd.Next(65, 90));//Chư in hoa. Chữ thường: TextRd = Convert.ToString((char)rd.Next(97, 122));
Đăng bởi :
Nhãn :

Hint Text | Gợi ý trong textbox

Hint text (water text) trong C#

Có 2 cách để giải quyết vấn đề này

Cách 1: yêu cầu đã cài DotnetBar: http://thuvienwinform.blogspot.com/p/blog-page.html

Đề có chữ gợi ý trong textBox rất đơn giản, ta sẽ sử dụng control textBoxX của DotnetBar
Chỉ cần gõ chữ gợi ý vào phần waterMark Text của textBoxX là được



Chú ý: nếu cài DotnetBar rùi mà không thấy control textBoxX thì xem phần "- Thêm ToolBox của DotNetBar vào Visual Studio:" tại: http://thuvienwinform.blogspot.com/p/blog-page.html#Huong-dan-add-control-dotnetbar




Cách 2: không cần cài DotnetBar

- Nhưng mình nghĩ thì cài DotnetBar luôn đi vì nó có nhiều cái sẵn có rất hay!
- Để thực hiện công viện này với textbox mặc định của visual thì cần thiết kế 1 lớp, đó là watermark: http://www.codeproject.com/Articles/27849/WaterMark-TextBox-For-Desktop-Applications-Using-C
10/13/2013
Đăng bởi :
Nhãn :

Kết nối C# đến SQLite

Hướng dẫn đầy đủ các thao tác giữa SQLite và winform (cụ thể là C#) .Như bài viết trước chúng ta đã giới thiệu sơ qua về SQLite. Hôm nay mình sẽ hướng dẫn các bạn chi tiết các bước kết nối từ C# đến CSDL của SQLite, rất đơn giản thôi.

Demo: https://www.dropbox.com/s/cjmq9o4091uw0iq/C%23-SQLite-thuvienwinform.rar

Bắt đầu!
Bước 1: ta phải có database đã, trong database có ít nhất 1 bảng. (Xem hướng dẫn tạo database và bảng với SQLite: http://thuvienwinform.blogspot.com/2013/10/SQLite-chay-ung-dung-su-dung-da-tabase-tren-may-khong-cai-sql.html).

CSDL chứa 1 bảng tb1 gồm 2 cột ID và Name (đã tạo ở bài viết trước)

Bước 2: Tạo 1 project mới có kiểu như sau: gồm 1 button và 1 datagridview


Bước 3: Add System.Data.SQLite vào project này (2 bước)
Bước 3.1: Chuột phải vào References -> Manage Nuget Packages...


Bước 3.2: làm như hình để thêm thư viên sử dụng SQLite
Chú ý: ấn vào All cho nó load xong hẵng tìm kiếm

Install xong thì using System.Data.SQLite;


Bước 4: Lập trình lấy dữ liệu ra (sau khi chạy sẽ gặp lỗi những không sao, code xong hãy chuyển qua bước 5):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
namespace SQLite
{
    public partial class Form1 : Form
    {
        SQLiteConnection conn = new SQLiteConnection("Data Source = test.db");
      //Cú pháp: Data Source = Đường dẫn đến file database. Ví dụ: Data Source = C:\test.db hoặc copy file database vào cùng thư mục
        public Form1()
        {
            InitializeComponent();
            this.button1.Click += new System.EventHandler(this.button1_Click);//Thêm sự kiện click
            conn.Open();//Mở kết nối
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SQLiteDataAdapter da = new SQLiteDataAdapter("Select * From tb1", conn);//Chọn toàn bảng
            DataTable dt = new DataTable("Lite");
            da.Fill(dt);//Xuất dữ liệu ra bảng
            dataGridView1.DataSource = dt;
        }
    }
}

OK ấn F5 và thưởng thức



Tải thư viện SQLite bằng Packet Manage Console
 vào Package Manager Console .


Gõ vào Install-package System.Data.SQLite xong ấn Enter


Kết quả như vậy là OK


Đăng bởi :
Nhãn :

SQLite Giải pháp cho những máy không cài SQL | Hướng dẫn cơ bản: tạo databse, lưu database, đọc database



SQLite là một hệ quản trị CSDL rất gọn nhẹ! Với những ứng dụng sử dụng đến CSDL chỉ chạy được trên những máy cài hệ quản  trị CSDL (cụ thể là SQL Server), còn những máy không cài được thì sao, sẽ không chạy được. Nhưng đừng lo, với SQLite bạn vẫn chạy các ứng dụng đó trên các máy khác được. Vì SQLite không cần cài đặt, file dll của nó chưa đến 1MB. 
Công cụ sử dụng là: sqlite3.exe (501KB): https://www.dropbox.com/s/6ag8gb47ryyvsaj/SQLite-thuvienwinform.rar
Giải nén ta được file test.db (ví dụ database ở dưới) và sqlite3.exe bạn có thể coi nó là SQL Server vậy, ta thực hành các câu lệnh với nó xong chuyển qua winform cũng tương tự thôi.

Hoặc ban có thể sử dụng SQLite Studio: http://sqlitestudio.pl/?act=download (2MB)

* Sử dụng SQLite Studio
- Thêm/tạo CSDL

- Tạo bảng

- Thêm dữ liệu vào bảng
SQLite Studio rất nhẹ và trực quan như kiểu SQL Server luôn! Lúc đầu nên dùng sqlite3.exe để thông thạo câu lệnh

1. Tạo Database cho SQLite:

Cú pháp: 
attach database 'ten_database.db' as 'TenDaiDienChoDatabase';

ví dụ:
attach 'test.db' as 'db';


khi đó trong cùng folder sẽ xuất hiện 1 file test.db


2. Tạo bảng dữ liệu trong database vừa tạo:

Cú pháp:
Create table TenBang  (
Cot1 KieuDuLieu,
Cot2 KieuDuLieu,
...     
Cotn KieuDuLieu
);


Ví dụ: 

Create table tb1  (
                            ID int,
                            Cot2 nvarchar(50),
                            );


Vậy là ta đã có 1 bảng tên tb1 với 2 cột là ID kiểu int và cột Name kiểu nvarchar.
Tham khảo thêm các kiểu dũ liệu: http://www.tutorialspoint.com/sqlite/sqlite_data_types.htm

3. Chèn dữ liệu vào bản (Giống SQL server)
Cú pháp
Insert Into Tenbang (TenCot) Values (GiaTri);


Ví Dụ:
Insert Into tb1 (ID, Name) Values (1, 'Nguyen Van X');


- Để xem dữ liệu trong bảng ta cũng sử dụng cú pháp Select * From tenbang;
kết quả trả về là: 1|Nguyen Van X


4. Lưu bảng

Cú pháp: 
.backup TenFileDatabase




5. Đọc lại dữ liệu từ database:

Cú pháp:
.restore TenFileDatabase
Select * From TenBang;


- Chú ý: sqlite3.exe và file database cùng thư mục


OK.
- Để xem một số câu  lệnh ta gõ vào .help






10/12/2013
Đăng bởi :
Nhãn :

Control NotifyIcon trong C# | Tạo icon trên khay hệ thống

Đầy đủ cách sử dụng NotifyIcon trong C#



Các Icon trong khay hệ thống (có thể kéo ra ngoài)
- Demo NotifyIcon: https://www.dropbox.com/s/v1ajn6w6suzidiu/NotifyIcon-thuvienwinform.rar
- Sử dụng cơ bản giống như trong demo.
- Tác dụng chính của nó là để kích hoạt lại Form khi nó bị ẩn xuống (Hide). Các thuộc tính của nó như sau:

Tên thuộc tính
Chức năng
(name)
Tên của NotifyIcon. Nó như tên biến vậy
BallootipIcon
Biểu tượng thông báo hiện ra khi ấn vào Icon này (phải kết hợp sự kiện Click)
BalloontipText
Chữ hiện ra khi ấn vào Icon
ContextMenuStrip
Menu lựa chọn khi ấn chuột phải vào Icon
ContextMenuTitile
Tiêu để chữ hiện ra khi tác động vào Icon
Icon
Icon (biểu tượng) hiện ở khay hệ thống
Text
K có tác dụng lắm J

- 2 Sự kiện hay sử dụng đối với NotifyIcon là: Click và MouseDoubleClick.
+ Click: sự kiện khi ấn vào biểu tượng trong khay hệ thống
+ DoubleClick: khi click kép vào nó (để hiện Form trở lại)

9/26/2013
Đăng bởi :
Nhãn :

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Lưu trữ

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -