Articles by "C# Winform căn bản"


Chào các bạn!

Nhiều bạn thắc mắc muốn thao tác với ảnh bằng C# Winform thì làm như thế nào, hôm nay mình sẽ hướng dẫn các bạn cách kết hợp hai control cơ bản là PictureBox OpenFileDialog để làm một chương trình "Picture Viewer" trong C#
Đầu tiên các bạn tìm hiểu sơ lược về hai control này nhé.




PICTURE BOX TRONG C#

PictureBox là một control khá hữu dụng của C# .NET. Nó cung cấp một vùng hình chữ nhật để chèn ảnh bất kỳ và kích cỡ có thể tùy chỉnh bằng nhiều cách khác nhau.
Picturebox hỗ trợ nhiều định dạng ảnh: BMP, GIF, JPEG, EXIF, PNG và TIFF, ICO... (các định dạng được GDI+ hỗ trợ)
PictureBox có thể lấy ảnh từ ổ cứng của bạn hoặc từ Internet

Đầu tiên mình sẽ hướng dẫn các bạn chèn ảnh từ ổ cứng:
Mình sẽ dùng ảnh PNG trong ví dụ bên dưới, các định dạng khác cũng làm tương tự.

Tại sao chúng ta lại phải thiết lập thuộc tính Width và Height? Vì ảnh của chúng ta và kích cỡ của PictureBox có thể khác nhau rất nhiều, nếu như không thiết lập thì ảnh có thể sẽ bị crop. Ngược lại muốn crop ảnh theo kích cỡ mong muốn thì cứ thiết lập thuộc tính Width, Height của PictureBox

Picturebox cũng có các thuộc tính tương tự như các control cơ bản khác, tuy nhiên có một số thuộc tính mới cần nói như SizeMode.
Thay vì thiết lập thuộc tính Width và Height của PictureBox, hoặc hình ảnh. Chúng ta có thể thiết lập nhanh bằng một số tùy chọn .NET cung cấp sẵn:

Chúng ta còn các SizeMode khác như (Normal, Zoom: căng ảnh nhưng duy trì tỉ lệ aspect ratioAutoSize: tự thiết lập size của pictureBox bằng với size của ảnh, CenterImage: Center ảnh vào trung tâm PictureBox, StretchImage: căng ảnh lên theo 2 chiều cho vừa với khung pictureBox)

Tiếp theo là chèn ảnh từ Internet. Ví dụ trên mình đã dùng thuộc tính ImageLocation để chèn ảnh bằng địa chỉ của nó. Vậy thì địa chỉ hình ảnh trên Internet thì sao nhỉ?
Chúng ta thử gán nhanh cho thuộc tính ImageLocation trong cửa sổ properties với giá trị: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3aZFMZ3jDv1pa1cvkSNUPHLgJnOeC_MuXY0FPpQU2I24_Hd1tbFX7-vt_qDp1ANqMRJAFtxX0oMVvxiVFYFKf4-t9nZYaro26Nb6jzWi_3M50jTrBE5x4vPqAXTXWmuSPnnPuuXegBg/s1600/cooltext125983511023412.png. Sau đó chạy thử chương trình lên và kết quả sẽ là:


Về phần sự kiện của PictureBox thì chúng ta cũng có các sự kiện cơ bản như các control khác (Click, Mouse Hover,...). Vậy là xong phần PictureBox, chúng ta cùng sang control thứ hai cần thiết để hoàn thành chương trình này.


OPEN FILE DIALOG TRONG C#

OpenFileDialog (OFD) cho phép người dùng browse một thư mục hoặc tệp tin. Là control thường thấy trong rất nhiều ứng dụng. Nhất là các gói cài đặt thường cho bạn chọn thư mục để cài.

Để cài đặt một OFD các bạn kéo nó ra từ thanh Toolbox, nhóm Dialogs.
Thường thì chúng ta sẽ thiết lập các thuộc tính cho OFD ở ngay trong khung Properties. OFD cũng có thuộc tính Name, Title, Tag,.. như các control khác. Tuy nhiên một số thuộc tính mới như:
- FileName: Tên mặc định của File. Nếu các bạn gõ vào đây "fileName1" thì khi mở hộp thoại "fileName1" sẽ đặt mặc định trong ô FileName. Vậy nên các bạn nên xóa và để trống thuộc tính này
- Filter: Bộ lọc file. Thông thường ta chỉ cần một số loại file nhất định, nhưng nếu thư mục có quá nhiều file khác nhau thì việc tìm kiếm sẽ mất nhiều thời gian. Nên chúng ta có thể thiết lập thuộc tính Filter để lọc ra các loại file mong muốn.
Ví dụ: ofd.Filter = "Windows Bitmaps|*.bmp|JPEG Files|*.jpg"
Cứ theo định dạng mô tả | *.đuôi tệp tin. Giữa những loại tệp tin với nhau cũng là một dấu gạch đứng |.
- CheckFileExist, CheckPathExist: Các bạn để mặc định là true để OFD kiểm tra file và đường dẫn có hợp lệ, tồn tại không.
- InitialDirectory: Thư mục mặc định mà khi OFD được show ra sẽ nằm ở đó.
- MultiSelect: Nếu các bạn muốn chọn nhiều file một lúc thì cho bằng true.
- ...

Để mở hộp thoại OFD, chúng ta cần một button và thiết lập cho nó sự kiện Click để chạy code show OFD.

DIALOG RESULT

DialogResult là một biến kiểu Enum, dùng để nhận giá trị trả về của var.ShowDialog(). Để kiểm tra xem người dùng vừa click nút nào, dự định làm gì.
DialogResult chứa các giá trị như: OK, Cancle, Ignore, Try, Yes, No,...

Vậy thì tiếp theo làm sao để ta lấy được hình ảnh từ OFD? Chung ta sẽ lấy đường dẫn của ảnh vừa chọn bằng thuộc tính FileName của OFD.

 Image img = Image.FromFile(openFileDialog1.FileName); 

Vậy là chúng ta đã học xong được tất cả các chức năng chính của PictureBox và OpenFileDialog rồi. Giờ chỉ còn kết hợp nó để làm chương trình xem ảnh thôi :D

Mình sẽ cung cấp code mẫu ở đây luôn. Ai có gì không hiểu thì bình luận hoặc pm trực tiếp mình qua facebook/email nhé

Chúc các bạn học tốt! Chào và hẹn gặp lại



Chào các bạn!

Chắc hẳn qua một thời gian dài học C# cùng với blog các bạn cũng đã từng nhiều lần sử dụng event trong chương trình của mình nhỉ?
Ví dụ cơ bản với một sự kiện nhận biết chuột vừa được click xuống
private void btn_MouseDown(object sender, MouseEventArgs e)
{
   //Do something...
}

Các bạn có bao giờ thắc mắc các tham số object senderMouseEventArgs e là gì không?
Đó là những tham số của event, được tạo và gán giá trị bởi Visual C#. 

THAM SỐ ĐẦU TIÊN: object sender
Sender mang kiểu dữ liệu object dùng chung, tổng quát.
Sender chứa một tham chiếu tới control/object đã gây ra event. Chúng ta có thể ép kiểu sender lại trở thành control/object để xử lý
Ví dụ: 
//Thay đổi text của button được click

protected void btn_Click (object sender, EventArgs ea)
{

    Button btn = sender as Button; 
    if(btn != null)
    {
        btn.Text = "I was clicked!";
    }
}

THAM SỐ THỨ HAI: MouseEventArgs e
Tham số này là nơi hành động thực sự xảy ra, tham số e cũng chứa một đối tượng, nhưng là kiểu cụ thể của một loại các tham số của mouse event, chứa các dữ liệu của event
Vậy thì MouseEventArgs sẽ chứa gì?
Bạn có thể tham khảo EventArgs Class từ MSDN hoặc các nguồn khác để xem thông tin, hoặc gọi biến e ra, rồi ấn dấu chấm "." để xem các thuộc tính/phương thức của e.





Trong đó:
 - Clicks: trả về số lần người dùng đã click chuột vào control đó
 - Button: trả về nút đã được nhấp (trái, giữa, phải)
 - X, Y: trả về tọa độ x,y mà con trỏ đang ở lúc sự kiện khởi chạy
 - ...

Mỗi event handler đều có các tham số riêng cho nó. Ví dụ btn_Clickbtn_MouseClick sẽ có hai tham số EventArgs và MouseEventArgs khác nhau. Nên tùy theo nhu cầu sử dụng mà ta sẽ gọi sự kiện cho hợp lý

Trên là những gì cơ bản về tham số của event, các bạn có thắc mắc thì bình luận mình sẽ giải đáp. 
Chào và chúc các bạn học tốt!!



Chào các bạn!

Đã lâu mình không viết bài trở lại, chắc cũng 3 tháng rồi :D nhưng traffic của blog vẫn đều đều ~400 bạn truy cập/ngày. Cảm ơn các bạn đã tin tưởng và ủng hộ blog, mình hứa sẽ cho ra thêm nhiều bài viết hay và bổ ích.

Gần đây mình có nhận được một yêu cầu của một bạn theo dõi blog, bạn ấy muốn làm một chương trình C# để thay đổi giờ hệ thống.
Hôm nay mình sẽ hướng dẫn các bạn viết ra chương trình đó. Nghe có vẻ rất dễ đúng ko?




Để thay đổi System Time bạn phải can thiệp vào hệ thống, trong C# bạn có thể dùng cách P/Invoke hàm SetSystemTime() theo WIN32 API có sẵn.
Đầu tiên bạn chuẩn bị cho mình một struct như sau:
private struct SYSTEMTIME
{
            public ushort Year;
            public ushort Month;
            public ushort DayOfWeek;
            public ushort Day;
            public ushort Hour;
            public ushort Minute;
            public ushort Second;
            public ushort Milliseconds;
}

Struct này tương tự theo cấu hình của class DateTime mà giờ hệ thống đang sử dụng :D
Sau đó các bạn thêm extern method này vào:
//Method set giờ hệ thống

[DllImport("kernel32.dll", SetLastError = true)]
private extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);

//


Đây là method sử dụng thư viện động "lõi hệ thống 32" (kernel32.dll) của windows, và gây những tác động lên nó. Lưu ý để sử dụng DllImport thì bạn cần thêm namespace sau:
using System.Runtime.InteropServices; 

Namespace này dùng để chứa class DllImport - dùng chỉ ra rằng những phương thức này được tiếp cận bởi những DLL không được chương trình quản lý với dạng 1 điểm đầu vào tĩnh (static entry point)

Sau khi using namespace, thêm method, các bạn bắt đầu gọi method đó. Các bạn có thể tạo 1 button để xử lý sự kiện onClick cho button đó để gọi hàm :D
private void submit_btn_Click(object sender, EventArgs e)
{
       //Tạo instance
       SYSTEMTIME s = new SYSTEMTIME();

       //Gán các giá trị (ở đây mình gán ngẫu nhiên)
       s.Year = (ushort)2009;
       s.Month = (ushort)12;
       s.DayOfWeek = (ushort)3;
       s.Day = (ushort)4;
       s.Hour = (ushort)5;
       s.Minute = (ushort)6;
       s.Second = (ushort)7;
       s.Milliseconds = (ushort)8;

       //Gọi extern method đã thêm ở trên và xem kết quả :D
       SetSystemTime(ref s);
}

Các bạn có thể dùng 1 Control DateTimePicker để lấy số liệu nhập vào, phân tích ra và gán cho giờ hệ thống
//Lấy dữ liệu của control DateTimePicker xuống lưu vào biến
DateTime result = dateTimePicker1.Value;

SYSTEMTIME s = new SYSTEMTIME();

//Phân tích ra và lưu vào struct
s.Year = (ushort)result.Year;
s.Month = (ushort)result.Month;
s.DayOfWeek = (ushort)result.DayOfWeek;
//v.v...

Cuối cùng các bạn build chương trình ra, tìm đến thư mục */obj/Debug. Chạy file thực thi *.exe với quyền admin (Run as administrator). Lưu ý phải chạy với quyền admin thì mới thành công, vì các hàm của WIN32 API cần quyền admin để thay đổi/can thiệp vào dll hệ thống


LƯU Ý

Một số bạn khi thay đổi ngày thì chương trình chạy ok, nhưng khi thay đổi giờ thì chương trình chạy sai. Đó là do hàm SetSystemTime() của Win32 API nhận vào giá trị UTC, rồi tự convert lên Local Time (+7). Nên chương trình mình sẽ sai. Các bạn tham khảo giải pháp Work around của mình. Các bạn nào có ý hay hơn hay inbox cho page mình nhé :D 


_______________________________________________________________________

Đừng nên làm những chương trình thay đổi giờ hệ thống như thế này, bởi vì nó sẽ:

1) Làm phiền người sử dụng, nếu 1 chương trình mình dùng mà làm thay đổi giờ hệ thống máy tính thì cực kì khó chịu
2) Có thể làm break các ứng dụng khác, làm thay đổi thông tin trial của một số phần mềm.

Chúc các bạn thành công!


Chào các bạn!
Hôm nay mình xin giới thiệu với các bạn cách thêm control động hay còn gọi là dynamic control trong C# windows form.


GIỚI THIỆU

Trong nhiều chương trình, đôi khi bạn cần tạo thêm một control mới ngay trong lúc chương trình đang thực thi, hoặc xóa một control hiện có sẵn.
Vậy thì làm thế nào? Lấy đâu ra giao diện thiết kế của Visual Studio để thêm?
Khi đó ta phải sử dụng control động (Dynamic controls)

Dynamic control trong lập trình C#

Visual Studio .NET không có mảng chứa control như Visual Basic 6.0. Nhưng tin vui là bạn vẫn có thể tự thiết lập để làm những điều tương tự. Các ưu điểm của C# Dynamic controls là chúng có thể được tạo ra để phản hồi với cách mà người dùng tương tác với các ứng dụng. Các control được thêm vào trong lúc chương trình thực thi thường là textbox hoặc button. Nhưng tất nhiên, hầu như tất cả các C# control đều có thể được tạo ra như là một dynamic control


LÀM THẾ NÀO ĐỂ TẠO CONTROL ĐỘNG TRONG C#

  • Đầu tiên các bạn cần khai báo một đối tượng Control (nhớ using các namespace cần thiết cho control cần dùng)
  • Thiết lập các thuộc tính cần thiết cho đối tượng vừa khai báo như: Vị trí (top, left, bottom, right), Text, Font, Color,....
  • Thêm control vào danh sách controls của form chứa nó.

Ta thực hành thôi :D 
Đầu tiên trong trình thiết kế, ta thêm một button, và cài đặt sự kiện click cho nó, mục đích khi bấm vào nút nó sẽ tự thêm một textbox mới như hình ở đầu bài.
Sau đó sử dụng đoạn code sau, và xem kết quả xảy ra nhé :) 

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int count = 1;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AddNewTextBox();
        }

        public System.Windows.Forms.TextBox AddNewTextBox()
        {
            System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
            this.Controls.Add(txt);
            txt.Top = count * 25;
            txt.Left = 100;
            txt.Text = "Icetea Viet TextBox " + this.count.ToString();
            count = count + 1;
            return txt;
        }
    }
}

   - Vậy là xong phần tạo. Tiếp theo là thao tác hoặc xóa controls. Để xóa control xác định thì bạn cần biết được một trong các thông tin sau (thứ tự của control đó trong list Controls của form, Key của control, Name hoặc Text của control...)
   - Bạn hãy tham khảo các method sau: this.Controls.RemoveAt(int index), this.Controls.RemoveByKey(string key),...

Hoặc các bạn có thể sử dụng vòng lặp foreach, duyệt qua tất cả các control trong list Controls và xét điều kiện
foreach (TextBox txtBox in this.Controls.OfType< TextBox >())
{
        if(txtBox.Text == "IceTea Viet")
        {
               //Do something
        }

        //other condition
}
Như vậy là ta đã biết cách tạo và sử dụng một dynamic control cho mình rồi.
Chúc các bạn học tốt, và nhớ để lại bình luận của mình bên dưới nhé :)



   Chào các bạn! 

    Đã lâu không trở lại với blog mình nhỉ :D dạo này mình lười quá, đồ án và deadline cũng nhiều. Thôi không dài dòng nữa, mình sẽ đi vào vấn đề chính.

   GIỚI THIỆU
   Đã bao giờ bạn nghĩ một phần mềm khi có quá nhiều control thì làm sao để quản lý nhanh các control đó. Hoặc khi có những "nhóm" các control phục vụ các chức năng liên quan đến nhau, khi cần show, hide chúng đồng loại lại phải gọi từng control??? 
   Panel đã ra đời để giải quyết vấn đề đó
   Panel dùng để tạo nhóm các control. Là một container với dạng một khung đơn giản để chưa các sub-control (button, textbox, ...) ở trong nó.




THUỘC TÍNH CỦA PANEL

   Cũng tương tự như các control khác Panel có những thuộc tính rất cơ bản.
   Lưu ý: Các sub-control nằm trong panel, thì sẽ bị ảnh hưởng bởi thuộc tính EnableVisible của panel. Cả hai thuộc tính này đều phụ thuộc vào thuộc tính của panel chứa nó. Đây cũng là lý do dùng panel để show/hide một cụm các control

   Có lẽ các bạn đang thắc mắc khi panel có những chức năng tương tự như Groupbox, vậy thi nó khác gì với groupbox mà chúng ta đã tìm hiểu qua các bài trước. Bạn hãy mở Properties của panel, xem và kiểm tra thử nhé


   Điểm khác nhau giữa Panel và Groupbox:
 - Panel có khả năng Scrollable trong khi groupbox thì không. Panel khi chứa nhiều control có kích thước quá lớn thì thanh cuộn sẽ hỗ trợ việc hiển thị các control đó.
 - Panel còn có hỗ trợ khung viền (borders) đa dạng hơn groupbox
 - Groupbox có thuộc tính Text, dùng làm Caption hiển thị trên đầu khung, trong khi Panel không có


THÊM CONTROL VÀO PANEL

   Để thêm control vào panel bạn có thể kéo thả control đó trực tiếp vào panel chứa nó. Hoặc sử dụng code để thêm
   Ví dụ: Với hàm sau
private void btnCreate_Click(object sender, EventArgs e)
{
        Panel dynamicPanel = new Panel();
        dynamicPanel.Location = new System.Drawing.Point(26, 12);
        dynamicPanel.Name = "Panel123";
        dynamicPanel.Size = new System.Drawing.Size(228, 200);
        dynamicPanel.BackColor = Color.LightBlue;
        dynamicPanel.BorderStyle = BorderStyle.Fixed3D;

        TextBox textBox1 = new TextBox();
        textBox1.Location = new Point(10, 10);
        textBox1.Text = "Học lập trình cùng IceTea Việt";
        textBox1.Size = new Size(200, 30);

        CheckBox checkBox1 = new CheckBox();
        checkBox1.Location = new Point(10, 50);
        checkBox1.Text = "Check Me";
        checkBox1.Size = new Size(200, 30);

        dynamicPanel.Controls.Add(textBox1);
        dynamicPanel.Controls.Add(checkBox1);

        Controls.Add(dynamicPanel);
}
   Kết quả trước và sau click button sẽ là:





TỔNG KẾT

Panel control là một container hay hay là một cơ chế nhóm control trong C# WinForms, và phù hợp cho cả mục đích hình ảnh giao diện và logic chương trình. Với nhiều phong các border, bạn có thể  tổ chức giao diện các sub-control trong panel. Và vì khả năng điều khiển các thuộc tính của các sub-control bạn có thể làm giảm độ phức tạp của code cho chương trình.

Chào các bạn và chúc các bạn học tập tốt!!!


   Chào các bạn! 
   Hôm nay mình lại tiếp tục Series lập trình C# winform căn bản kèm theo ví dụ thực tế


GIỚI THIỆU
   Một phần mềm hoàn chỉnh không phải lúc nào cũng đưa ra các thông báo cho người dùng bằng MessageBox được, vì khi đó người dùng cần phải ấn vào OK, hoặc tắt MessageBox đi, rất phiền phức. Có một cách khác để thông báo mà các phần mềm khác hay dùng đó chính là dùng control mà mình sẽ giới thiệu hôm nay - NotifyIcon.



   NotifyIcon thường thông báo khi ta đóng phần mềm xuống thanh Taskbar, hoặc thông báo thông tin về update phần mềm, hoặc thông báo thời gian thực thi của một lệnh (-shutdown -s -t chẳng hạn :D ). Cũng như các Control khác, NotifyIcon có các thuộc tính và sự kiện cơ bản.


THUỘC TÍNH CỦA NOTIFYICON



   Icon mình có thể thêm Icon tùy biến ở ngoài vào theo ý thích. Vì mình dùng Win10 nên tạm thời các demo đều là hình ảnh của Win 10 nên các bạn thông cảm.
   Ví dụ: Với đoạn code sau
//Icon trên khay hệ thống
notifyIcon1.Icon = SystemIcons.WinLogo; 

//Biểu tượng xuất hiện trên thông báo
notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 

notifyIcon1.BalloonTipText = "IceTea Việt!";
notifyIcon1.BalloonTipTitle = "Thông báo!"; 

notifyIcon1.ShowBalloonTip(1000);
Thì kết quả sẽ là:

SỰ KIỆN CỦA NOTIFYICON
   
   NotifyIcon có các sự kiện hay dùng như sự kiện Click, DoubleClick. Và thường được dùng kèm với các sự kiện khác của Form.   Ví dụ: Ta muốn làm một thông báo khi đóng (Minimize) chương trình xuống, và khi hiện chương trình lại lại thông báo thêm lần nữa, ta thực hiện với đoạn code sau, với ShowBalloonTip(int_value) là lệnh hiển thị thông báo của NotifyIcon
private void YourForm_SizeChanged(object sender, EventArgs e)
{
        if(this.WindowState == FormWindowState.Minimized)
        {
            notifyIcon1.Icon = SystemIcons.WinLogo;
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;

            notifyIcon1.BalloonTipText = "IceTea Việt!";
            notifyIcon1.BalloonTipTitle = "Thông báo!"; 

            //Lệnh gọi thông báo ra màn hình với 1000 là thời gian hiển thị
            notifyIcon1.ShowBalloonTip(1000);
        }
        else if(this.WindowState == FormWindowState.Normal)
        {
            notifyIcon1.BalloonTipText = "Ứng dụng đã được mở lại";

            notifyIcon1.ShowBalloonTip(1000);
        }
            
}
   Thì khi đóng chương trình xuống Taskbar sẽ hiển thị thông báo Notification với tiêu đề là "Thông báo", nội dung là "IceTea Việt". Với thời gian hiển thị là 10 giây. Và tương tự  khi mở lại.
   Trên là những thông tin cơ bản về Control NotifyIcon của C#. Các bạn tham khảo nếu thiếu hay không hiểu gì cứ viêc pm hỏi mình, hoặc comment mình sẽ trả lời ngay.
   Như thường lệ là đoạn code để đoán kết quả:
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
 public Form1()
 {
     InitializeComponent();
 }

 private void Form1_Load(object sender, EventArgs e)
 {
     // When the program begins, show the balloon on the icon for one second.
     notifyIcon1.ShowBalloonTip(1000);
 }

 private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
     // When icon is double-clicked, show this message.
     MessageBox.Show("Doing something important on double-click...");
     // Then, hide the icon.
     notifyIcon1.Visible = false;
 }
    }
}

TỔNG KẾT
   Đối với chương trình yêu cầu thông báo liên tục, NotifyIcon có thể giúp tích hợp vào hệ điều hành chức năng này. Bằng cách kết hợp các NotifyIcon với các balloonTip, bạn có thể đưa ra những cảnh báo, attention-grabbing hoặc tin nhắn.

Chào các bạn và hẹn gặp lại vào các bài sau!





GIỚI THIỆU

   Chào các bạn!
   Hôm nay mình xin giới thiệu với các bạn GroupBox, một Container dùng để "chứa" các Control khác. GroupBox có dạng hình chữ nhật, dùng gom nhóm các Control có liên quan lại với nhau.


   Chúng ta sẽ bắt đầu vào việc tạo một GroupBox, một GroupBox có thể được tạo từ thanh công cụ ToolBox -> Container


THUỘC TÍNH CỦA GROUPBOX

   Cũng tương tự như một số Control cơ bản khác, ở đây mình xin giới thiệu thuộc tính Dock hay dùng với GroupBox. Bạn có thể scroll chuột và tự tìm hiểu vì nó cũng rất đơn giản
- Top, Bottom, Left, Right: Nó sẽ đưa Groupbox của bạn lên từng góc cụ thể.
- Center: Mở rộng Groupbox, sao cho lấp đầy hết form.
- None: Mặc định, tắt chức năng Docking



SỰ KIỆN CỦA GROUPBOX

Sự kiện mặc định của groupBox là groupBox_Enter, sự kiện này được chạy khi Control chứa trong groupBox trở thành active control của Form. Ví dụ ta có Form như sau.
   Con trỏ ban đầu ở khung textBox, Khi ta tab nó chuyển sang các Control khác, và khi chuyển đến Button1 thì sự kiện Enter sẽ chạy, và mình đã xuất ra thông báo bằng MessageBox   
   Ngoài sự kiện này ra thì Groupbox còn nhiều sự kiện khác nhưng theo mình là không đáng để bận tâm tới

   Trên là những thứ cơ bản về Groupbox, mọi thắc mắc cứ liên hệ trực tiếp với mình. Như thường lệ là đoạn code đơn giản từ cái proj của mình cho các bạn đoán kết quả
public void ShowSearchForm(MainForm mainfrm)
{
       PopupForm search = new PopupForm(mainfrm);

       search.label.Text = "TÌM KIẾM HỌC SINH";

       search.groupBoxAdd.Visible = false;
       search.groupBoxEdit.Visible = false;
       search.groupBoxSearch.Visible = true;

       search.Show();
}


public void ShowAddForm(MainForm mainfrm)
{     
       PopupForm add = new PopupForm(mainfrm);

       add.label.Text = "THÊM HỌC SINH";

       add.groupBoxAdd.Visible = true;
       add.groupBoxEdit.Visible = false;
       add.groupBoxSearch.Visible = false;

       add.Show();
}

public void ShowEditForm(MainForm mainfrm)
{
       if(SelectedStudentId != "0")
       {
            PopupForm edit = new PopupForm(mainfrm);

            edit.label.Text = "SỬA HỌC SINH";

            edit.groupBoxAdd.Visible = false;
            edit.groupBoxEdit.Visible = true;
            edit.groupBoxSearch.Visible = false;

            edit.Show();
       }
       else
            MessageBox.Show("Chọn sinh viên cần sửa!", "Thông báo");
                 
}

TỔNG  KẾT

Groupbox không phải là một control thú vị trong lập trình C# Winform, nhưng chắc chắn nó là một control rất hữu dụng. Nó có thể giúp tạo một giao diện rõ ràng và dễ sử dụng cho chương trình của bạn
Chào các bạn, chúc các bạn học tốt!



Chào các bạn!

Hôm nay tiếp tục series lập trình winform cơ bản với ngôn ngữ C#, mình xin giới thiệu với các bạn một control mới rất hay sử dụng trong các Form đăng ký thông tin. Chính là ComboBox. 


GIỚI THIỆU

Một ComboBox hiển thị như một Textbox kết hợp với một Listbox, cho phép người dùng lựa chọn các mục từ danh sách hoặc nhập một giá trị mới.




THUỘC TÍNH CỦA COMBOBOX

   ComboBox cũng có các thuộc tính giống như các Control cơ bản khác. Nhưng có thêm các thuộc tính mới dạng DropDown như DropDownStyle, DropDownWidth, MaxDropDownItems...
Thuộc tính cơ bản của Control

- DropDownStyle: Thuộc tính DropDownStyle xác định các mà danh sách được hiển thị. Thuộc tính DropDownStyle cũng xác định xem phần văn bản có thể được chỉnh sửa hay không.
Với:
- Simple: hiện ngay list item có sẵn.
- DropDownList: là danh sách hiện ra cố định, không thể tự nhập/chỉnh sửa item trong ComboBox.
DropDown: có thể thêm item mới bằng tay và chỉnh sửa Item đã chọn.

Các bạn hãy thử chỉnh sửa các thứ này ngay trong code của mình:
Vd: 
comboBox1.DropDownStyle = ComboBoxStyle.DropDown;

  
 - MaxDropDownItems: Xác định số lượng Item tối đa khi mở danh sách sẽ hiện ra cho các bạn


PHƯƠNG THỨC CỦA COMBOBOX

   Phương thức thường thấy nhất là các phương thức thêm/xóa/sửa dữ liệu trong ComboBox. Để thêm vào ta dùng phương thức Add, để xóa tất cả Item đã thêm ta dùng phương thức Clear, để xóa item cụ thể ta dùng phương thức Remove,...
//Thêm dữ liệu
comboBox1.Items.Add("IceTea Việt");
comboBox1.Items.Add("Lập trình cuộc sống");
comboBox1.Items.Add("Xe đạp");

//Xóa dữ liệu cụ thể bằng chính Text của dữ liệu đó
comboBox1.Items.Remove("Xe đạp");
//Ta cũng có thể xóa theo chỉ số của item đó trong List dữ liệu
comboBox1.Items.RemoveAt(2); //Xóa item thứ 3 trong dữ liệu, vì 2 là index
 
   LẤY DỮ LIỆU TỪ COMBOBOX: 
   Có thể lấy dữ liệu băng nhiều cách, tham khảo đoạn code sau
//Lấy trực tiếp từ thuộc tính Text của ComboBox
//Nhưng nếu ComboBox chưa được chọn thì sẽ không có giá trị
string var;
var = comboBox1.Text;

//Lấy giá trị qua thuộc tính SelectedItem
var item = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);
//Hoặc lấy theo Text mình muốn
var item = this.comboBox1.GetItemText(this.comboBox1.FindStringExact("Xe đạp"));

SỰ KIỆN CỦA COMBOBOX
   Sự kiện của ComboBox không nhiều, sự kiện mặc định của nó là comboBox_SelectedIndexChanged, xảy ra khi chúng ta chọn một Item mới trong ComboBox.

   Bài viết về ComboBox mình đến đây là dài đối với các bạn rồi, mình còn một sô vấn đề muốn nói về ComboBox nữa, thôi thì để bài sau vậy.
Như thường lệ là một đoạn code để các bạn đoán kết quá. Đoạn này có vẻ dễ nhỉ :D
private void Form1_Load(object sender, EventArgs e)
{
        comboBox1.Items.Add("weekdays");
        comboBox1.Items.Add("year");
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
        comboBox2.Items.Clear();
        if (comboBox1.SelectedItem == "weekdays")
        {
            comboBox2.Items.Add("Sunday");
            comboBox2.Items.Add("Monday");
            comboBox2.Items.Add("Tuesday");
         }
         else if (comboBox1.SelectedItem == "year")
         {
            comboBox2.Items.Add("2012");
            comboBox2.Items.Add("2013");
            comboBox2.Items.Add("2014");
         }
}
   
TỔNG KẾT
   
Bằng cách kết hợp Textbox và một danh sách drop-down thông thường, Combobox đại diện cho một control thực sự hữu ích, một hybrid widget trong C# Winform. Nó cũng tạo ra ý tưởng về các hộp thoại dialogs, nơi mà sẽ có các gợi ý cho người dùng từ danh sách drop-down và lại chấp nhận được tất cả giá trị input bất kì

   Bài sau về ComboBox mình sẽ gửi đến các bạn cách gán một DataSource với ComboBox, AutoComplete với ComboBox, ở một cách nhìn đơn giản nhất :D Có lẽ mình sẽ viết bài đó sau khi hướng dẫn cho các bạn một chút về DataSet, DataTable

   Chào các bạn, chúc các bạn học tốt!



   Chào các bạn! 
   Sau mấy ngày lười biếng thì hôm nay mình đã trở lại và ăn hại hơn xưa :D, phần vì ở là nghỉ hè nên lười, chỉ muốn chơi game và xem phim, phần vì mình vừa code xong game cờ Caro với con stupid A.I. Ai muốn chơi thử thì liên hệ mình nhé :D


GIỚI THIỆU

Hôm nay mình sẽ giới thiệu với các bạn 2 control đơn giản và cần thiết là RadioButtonCheckbox. Chúng ta hãy cùng xem có thể làm đc gì với nó nhé 



RADIO BUTTON

     RadioButton cho phép người dùng chỉ được chọn một lựa chọn duy nhất trong các lựa chọn cùng 1 "nhóm". Có nghĩa là nếu 1 nhóm các RadioButton thì nếu bạn check một nút, thì tất cả các nút còn lại đều ở trạng thái unchecked. Giống như bảng chọn giới tính thì chỉ được chọn Nam hoặc Nữ, chứ làm sao mà có kiểu lai hóa giữa 2 cái như vậy đc =))

     Một RadioButton có thể hiển thị nội dung text, hình ảnh hoặc cả 2. Các thuộc tính của RadionButton cũng tương tự như các control khác. Nhưng nó có thêm một thuộc tính Checked để lưu trạng thái đã chọn hay chưa chọn của nút
     Để thay đổi trạng thái cho RadioButton ta dùng cú pháp sau:
tênRadioButton.Checked = true;
 Ta tiếp tục với ví dụ sau: Ta có một form như hình: 
Ta sẽ viết code cho mặc định là nút đầu tiên sẽ được check, và nếu mục nào đang được check, khi bấm vào button1 thì nó sẽ hiện nội dung của mục đó.
//Ta dùng sự kiện FormLoad để mặc định cho nút đầu tiên được chọn
private void Form1_Load(object sender, EventArgs e)
{
       radioButton1.Checked = true;
}

//Sau đó xử lý sự kiện click cho Button1
private void button1_Click(object sender, EventArgs e)
{
       if (radioButton1.Checked == true)
       {
           MessageBox.Show("Bạn vừa chọn RadioButton 1 với nội dung là: " + radioButton1.Text);
           return;
       }
       else if (radioButton2.Checked == true)
       {
           MessageBox.Show("Bạn vừa chọn RadioButton 2 với nội dung là: " + radioButton2.Text);
           return;
       }
       else if (radioButton3.Checked == true)
       {
           MessageBox.Show("Bạn vừa chọn RadioButton 3 với nội dung là: " + radioButton3.Text);
           return;
       }
       else if (radioButton4.Checked == true)
       {
           MessageBox.Show("Bạn vừa chọn RadioButton 4 với nội dung là: " + radioButton4.Text);
           return;
       }
}
Và kết quả sẽ là:

CHECKBOX

     Không như RadioButtons chỉ có thể chọn một mục cho cả nhóm và khi đã chọn rồi thì không thể deselect (hủy chọn) được, thì Checkbox ta có thể chọn nhiều mục khác nhau cùng lúc và có thể chọn và hủy tùy ý. Checkbox thường được sử dụng để tạo các sự lựa chọn cho người dùng. Một ví dụ kinh điển là khi đăng kí tài khoản hay cài đặt phần mềm ta hay chọn vào "Tôi đồng ý với điều khoản trên..." :D
     Các thuộc tính cơ bản của Checkbox cũng giống tương tự như các Control cơ bản khác, tuy nhiên có thêm thuộc tính Checked, CheckState ThreeState
Các thuộc tính cơ bản của CheckBox
     THREE STATE CỦA CHECKBOX: Ta nói thêm về ThreeState. Khi đã bật lựa chọn này thì người dùng có thể tự do lựa chọn 3 lựa chọn trên một CheckBox là Checked, UnChecked và Indeterminate. Nếu ThreeState không được bật thì ta chỉ có thể cho Checkbox vào trạng thái Indeterminate bằng code, không trưc tiếp trên Form được. Tham khảo thêm trên MSDN

     Về sự kiện, ta có sự kiện hay dùng nhất của CheckBox đó là CheckedChangedCheckStateChanged. Ví dụ với đoạn code sau:
//Sự kiện CheckedChanged chỉ theo dõi được hai trạng thái???
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
       checkBox4.ThreeState = true;
       if(checkBox4.CheckState == CheckState.Checked)
       {
            MessageBox.Show(checkBox4.Text + " đang được chọn");
       }
       else if(checkBox4.CheckState == CheckState.Unchecked)
       {
            MessageBox.Show(checkBox4.Text + " không được chọn");
       }
       else if(checkBox4.CheckState == CheckState.Indeterminate)
       {
            MessageBox.Show(checkBox4.Text + " đang ở trạng thái Indeterminate");
       }
}

//Sự kiện CheckStateChanged theo dõi được cả ba trạng thái, bao gồm cả Indeterminate???
private void checkBox5_CheckStateChanged(object sender, EventArgs e)
{
       checkBox5.ThreeState = true;
       if (checkBox5.CheckState == CheckState.Checked)
       {
           MessageBox.Show(checkBox5.Text + " đang được chọn");
       }
       else if (checkBox5.CheckState == CheckState.Unchecked)
       {
           MessageBox.Show(checkBox5.Text + " không được chọn");
       }
       else if (checkBox5.CheckState == CheckState.Indeterminate)
       {
           MessageBox.Show(checkBox5.Text + " đang ở trạng thái Indeterminate");
       }
}
Và kết quả sẽ là khi ta chọn checkbox IceTea Việt thành Indeterminate thì nó sẽ không "lắng nghe" được và không xuât thông báo, còn ở checkbox iceteaviet.blogspot.com thì nó hoàn thành tốt cả ba trạng thái trong sự kiện

     Ngoài các sự kiện trên bạn cũng có thể kết hợp các control đã học để tùy biến cho các sự kiện của Checkbox và RadioButton. 


TỔNG KẾT
   RadioButton và Checkbox trong C# Winforms là những control cho phép người dùng xác định những chọn lựa của mình thông qua những gợi ý, đề xuất từ chương trình. Là những control hữu dụng không thể thiếu trong các chương trình hiện nay

     Bài này đến đây là kết thúc rồi, các bạn cũng đã học gần hết các Control cơ bản rồi đó, sau khi học đầy đủ chúng ta lại làm đồ án thôi :D :D Nhớ làm bài Pet Project #1 của mình tại đây nhé: http://iceteaviet.blogspot.com/2015/07/winform-c-can-banproject-1-phan-mem.html

     Chào các bạn, chúc các bạn học tốt!



GIỚI THIỆU

Chào các bạn!

Hôm nay mình xin nói sơ về chức năng khá hay của Textbox đó là AutoComplete
Chức năng Autocomplete giúp gợi ý, tự hoàn thiện từ khi gõ của Textbox C#: Đây là một chức năng khá hay và làm tăng tính chuyên nghiệp của phần mềm bạn làm lên rất nhiều!
Chức năng AutoComplete của Textbox trong C#

Nó gồm có 3 thuộc tính:

AutocompleteCustomSource 
Là một Collection, nơi chứa những từ gợi ý. Khi gõ vào những từ gần giống trong này thì nó sẽ xuất hiện gọi ý. (chỉ dùng làm nguồn cho chế độ CustomSource).
Ta có thể thêm từ vào đây bằng code thông qua AutoCompleteStringCollection. Hoặc thêm vào thông qua Properties ở ngoài giao diện form:

 
 AutoCompleteMode 
Là kiểu gợi ý. Có 3 chế độ là
   + Suggest: gợi ý ở dạng danh sách, muốn chọn phải ấn chuột hoặc ấn phím di chuyển
   + Append: khi gõ từ gần đúng thì nó sẽ hoàn thiện luôn
   + SuggestAppend: (nên dùng) nó kết hơp cả 2 cái trên. Tức là sẽ vừa hiện thị danh sách gợi ý vừa hoàn thiện luôn.


 AutocompleteSoure  
  + CustomSource: lấy những từ đã gõ trong AutocompleteCustomSource để gợi ý
   + HistoryList: lấy những từ đã gõ để gợi ý
   + Các mode còn lại ít dùng nên mình sẽ không đề cập ở đây.

Sau đây là đoạn code tham khảo về cách thiết lập AutoComplete bằng code:

 private void Form1_Load(object sender, EventArgs e)
 {
       LoadDataToCollection();
       SetDataToCollection();
 }
 

//Thêm bằng tay vào Collection các từ khóa
 private void SetDataToCollection()
 {
       AutoCompleteStringCollection auto1 = new AutoCompleteStringCollection();
       txtBox1.AutoCompleteMode = AutoCompleteMode.Append;
       txtBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
       txtBox2.AutoCompleteMode = AutoCompleteMode.Suggest;
       txtBox2.AutoCompleteSource = AutoCompleteSource.CustomSource;
       string[] arrayName ={"Tâm",
                          "Nhã",
                          "Sơn",
                          "Phúc",
                          "Huyền",
                          "Ngân",
                          "Tấn Huy",
                          "Huy Tôi",
                          "Nguyễn ",
                          "iceteaviet.blogspot.com",
                          "iceteaviet.blogspot.com/2015/07/lam-quen-voi-textbox-trong-c.html",
                          "iceteaviet.blogspot.com/2015/07/hoc-c-thi-bat-au-tu-au.html",
                          "iceteaviet.blogspot.com/2015/07/oi-tuong-button.html"
                               
                          };
       foreach (string name in arrayName) 
       {
           auto1.Add(name);
       }
 
       txtBox1.AutoCompleteCustomSource = auto1;
       txtBox2.AutoCompleteCustomSource = auto1;
}


//Thêm các từ khóa từ cơ sở dữ liệu (các bạn nào chưa học qua SQL Ser thì khỏi quan tâm nhé)
private void LoadDataToCollection()
{
      AutoCompleteStringCollection auto2 = new AutoCompleteStringCollection();
           
      string strConnection = "Data Source=.\\SQLEXPRESS; Database=Northwind;Integrated Security=true;";
      SqlConnection conn = new SqlConnection();
      conn.ConnectionString = strConnection;
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = conn;
      cmd.CommandType = CommandType.Text;
 
      string sql = "Select  ContactName from Customers ";
      SqlCommand com = new SqlCommand();
 
      com.Connection = conn;
      com.CommandText = sql;
      com.CommandType = CommandType.Text;
      conn.Open();
      SqlDataReader reader ;
      reader = com.ExecuteReader();
      if(reader!=null)
      {
             while(reader.Read())
             {
                auto2.Add(reader["ContactName"].ToString());
             }
      }
 
      txtName1.AutoCompleteMode = AutoCompleteMode.Append;
      txtName1.AutoCompleteSource = AutoCompleteSource.CustomSource;
      txtName1.AutoCompleteCustomSource = auto2;
 
      txtName2.AutoCompleteMode = AutoCompleteMode.Suggest;
      txtName2.AutoCompleteSource = AutoCompleteSource.CustomSource;
      txtName2.AutoCompleteCustomSource = auto2;
 
 
}

TỔNG KẾT
Chức năng AutoComplete của textbox thường được dùng để làm gợi ý cho khung tra từ điển, danh bạ. Hoặc các phần mềm có mục điền thông tin thay vì dùng Combobox bạn có thể dùng textbox với Autocomplete sẽ làm cho phần mềm bạn trở nên chuyên nghiệp hơn nhiều.
Các bạn cũng có thể tự built cho mình một Control Autocomplete như thế. Tham khảo bài viết của tác giả Psycho Coder Tại đây. Hoặc tham khảo thêm tại đây và trên MSDN

Chào các bạn và chúc các bạn học tốt :D Hẹn gặp lại ở bài sau!


Contact Form

Name

Email *

Message *

Powered by Blogger.
Javascript DisablePlease Enable Javascript To See All Widget