Event chuẩn .Net trong C#

Khóa học lập trình C# nâng cao

4.2 (6 đánh giá)
Tạo bởi K9 Cập nhật lần cuối 23:34 26-07-2020 30.443 lượt xem 6 bình luận
Tác giả/Dịch giả: K9
Học nhanh

Danh sách bài học

Event chuẩn .Net trong C#

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về EVENT VỚI DELEGATE TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Event chuẩn .Net trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Event chuẩn .Net là gì?
  • Cách dùng Event chuẩn .Net trong C#
  • Dùng Event chuẩn .Net với tham số truyền vào trong C#

Event chuẩn .Net là gì?

Event chuẩn .Netevent với Delegate nhưng thỏa mãn các điều kiện:

  • Delegate có kiểu trả về là void
  • Delegate có hai tham số, tham số thứ nhất có kiểu dữ liệu là object, tham số thứ hai có kiểu EventArgs. object chính là đối tượng phát sinh sự kiện, EventArgs chính là class giữ thông tin mà đối tượng gửi kèm trong quá trình phát sinh sự kiện.
  • Lúc này thay vì chúng ta dùng Delegate do chúng ta tự tạo thì .Net có sẵn Delegate tên là EventHandler theo chuẩn ở trên.

Vậy các event có sẵn trong .Net như Console.CancelKeyPress hay nhiều event khác nữa

Event chuẩn .Net trong C#

Các event này thường được đánh ký hiệu là tia sét:

Event chuẩn .Net trong C#


Cách dùng Event chuẩn .Net trong C#

Với mong muốn tạo ra một class HocSinh để quản lý Tên của học sinh. Vì muốn biết khi nào tên của học sinh thay đổi sẽ ghi lại thành log sau này đối chiếu lịch sử thay đổi này. Chúng ta sẽ tạo một Event NameChanged với Delegate EventHandler có sẵn của .Net và ủy thác việc ghi log lại.

Mình cũng đóng gói event mình sẽ tạo. Nhưng với event thay vì get set thì sẽ là addremove. Đồng thời tạo hàm OnNameChanged để thông báo event đã có sự thay đổi.

Lưu ý:  sử dụng _NameChanged chứ không phải NameChanged. Vì filed _NameChanged chính là event thật sự. còn event NameChanged chính là event nhận hàm ủy thác addremove mà thôi.

Chúng ta truyền mặc định this vào tham số đầu tiên để thể hiện class HocSinh gọi event này, tạo một đối tượng EventArgs vào tham số thứ hai để thỏa mãn đầy đủ tham số cho Delegate EventHandler. Sau này, bạn có thể dùng các tham số này ở phần sau.

class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;

            HocSinh hs = new HocSinh();
            hs.NameChanged += Hs_NameChanged;
            hs.Name = "Tên lần 1";
            hs.Name = "Tên lần 2";
            hs.Name = "Tên cuối";

            Console.ReadLine();
        }

        private static void Hs_NameChanged(object sender, EventArgs e)
        {
            Console.WriteLine("Tên có thay đổi.");
        }
    }

    public class HocSinh
    {
        private string _Name;
        public string Name
        {
            get => _Name;
            set
            {
                _Name = value;
                OnNameChanged();
            }
        }


        private event EventHandler _NameChanged;
        public event EventHandler NameChanged
        {
            add
            {
                _NameChanged += value;
            }
            remove
            {
                _NameChanged -= value;
            }
        }

        void OnNameChanged()
        {
            if(_NameChanged != null)
            {
                _NameChanged(this, new EventArgs());
            }
        }
    }

Mỗi khi có sự thay đổi tên của học sinh thì event NameChanged được thông báo lên. Vậy là chúng ta có thể biết để ghi ra màn hình cho biết tên học sinh đã thay đổi.

Event chuẩn .Net trong C#


Dùng Event chuẩn .Net với tham số truyền vào

Chúng ta đã biết khi nào tên của học sinh thay đổi và thông báo. Nhưng không thể biết học sinh đó đã đổi tên thành gì. Vậy để có thể biết được giá trị sau khi cập nhật là gì? Chúng ta sẽ dùng tới tham số thứ hai đó là EventArgs.

Vì tham số thứ hai chỉ cần có kiểu dữ liệu là EventArgs nên chúng ta sẽ tạo một class mới là NameChangedEventArgs kết thừa lại EventArgs .

Class này sẽ có Constructor với tham số đầu vào là tên mới của học sinh. Và có thuộc tính là Name public ra.

Ngay tại vị trí khai báo event NameChanged _NameChanged. Chúng ta sẽ thêm generic NameChangedEventArgs vào sau EventHandler để thông báo rằng mình sẽ dùng kiểu dữ liệu NameChangedEventArgs thay cho EventArgs.

Khi thông báo event được thực hiện trong hàm OnNameChanged. Chúng ta sẽ thay new EventArgs thành new NameChangedEventArgs đồng thời truyền tên mới của học sinh vào. Hàm OnNameChanged cũng phải thêm tham số đầu vào kiểu dữ liệu là string để có thể truyền tên mới của học sinh vào. Đồng thời cũng phải truyền value vào khi gọi hàm OnNameChanged tại hàm set của Name.

Lúc này, phía ủy thác event cũng phải thay đổi EventArgs thành NameChangedEventArgs có thể lấy tên này ra dùng thông qua tham số thứ hai đang có tên là e. Chúng ta sẽ thông báo ra tên mới của học sinh là gì bằng cách cộng thêm chuỗi e.Name.

class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Unicode;

            HocSinh hs = new HocSinh();
            hs.NameChanged += Hs_NameChanged;
            hs.Name = "Tên lần 1";
            hs.Name = "Tên lần 2";
            hs.Name = "Tên cuối";

            Console.ReadLine();
        }

        private static void Hs_NameChanged(object sender, NameChangedEventArgs e)
        {
            Console.WriteLine("Tên có thay đổi: " + e.Name);
        }
    }

    public class HocSinh
    {
        private string _Name;
        public string Name
        {
            get => _Name;
            set
            {
                _Name = value;
                OnNameChanged(value);
            }
        }


        private event EventHandler<NameChangedEventArgs> _NameChanged;
        public event EventHandler<NameChangedEventArgs> NameChanged
        {
            add
            {
                _NameChanged += value;
            }
            remove
            {
                _NameChanged -= value;
            }
        }

        void OnNameChanged(string name)
        {
            if(_NameChanged != null)
            {
                _NameChanged(this, new NameChangedEventArgs(name));
            }
        }
    }

    public class NameChangedEventArgs : EventArgs
    {
        public string Name { get; set; }
        public NameChangedEventArgs(string name)
        {
            Name = name;
        }
    }

Kết quả:

Event chuẩn .Net trong C#


Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Event chuẩn .Net là gì?
  • Cách dùng Event chuẩn .Net trong C#
  • Dùng Event chuẩn .Net với tham số truyền vào trong C#

Bài học sau chúng ta sẽ cùng tìm hiểu về MULTI THREADING TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Event chuẩn .Net trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

K9

Nhà sáng lập Howkteam.com, KQuiz.vn & tác giả các khóa học C#, Auto, Unity3D, Python....

Với mong muốn mang đến kiến thức chất lượng, miễn phí cho mọi người, với tâm huyết phá bỏ rào cản kiến thức từ việc giáo dục thu phí. Tôi đã cùng đội ngũ Kteam đã lập nên trang website này để thế giới phẳng hơn.
Hãy cùng chúng tôi lan tỏa kiến thức đến cộng đồng! 

Khóa học

Khóa học lập trình C# nâng cao

Bạn đã học hết các khoá học về C# CƠ BẢN, LẬP TRÌNH WINFORM thậm chí là LẬP TRÌNH WPF nhưng vẫn bối rối trước những hướng dẫn về CÁC PROJECT THỰC TẾ của Kteam?

Hoặc bạn nghe nói mãi về .NET nhưng vẫn thắc mắc nó có gì hay ho bên trong đó?

Hay đơn giản bạn viết muốn 1 đoạn code cực kỳ nguy hiểm khiến người khác khi nhìn vào phải thốt lên: “Ồ!!!......... Trẻ trâu…”

Khoá học lần này sẽ giúp bạn giải đáp những thắc mắc trên. Chào mừng các bạn đã đến với khoá học Lập trình C# nâng cao của Kteam.

Đánh giá

huyy2103 đã đánh giá 19:09 13-09-2023

Vo Tan Duc đã đánh giá 19:09 18-05-2023

Hay quá anh ơi!

hieulv105 đã đánh giá 16:46 08-02-2022

nguyenchiphu đã đánh giá 18:22 24-12-2021

Nerosaro đã đánh giá 23:40 08-08-2021

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
truongluong đã bình luận 19:13 14-07-2024

phần này có bài tập thực hành ko ạ

 

Vo Tan Duc đã bình luận 20:37 02-09-2022

Chào anh Long, anh cho em hỏi: Làm sao để tạo ra 1 event - delegate cho riêng mình mà không dùng delegate có sẵn của .NET mà event mình tạo ra được cho là event chuẩn .NET anh? Cảm ơn anh

Le Rachitique đã bình luận 18:11 06-02-2022

Mình thấy đã dùng generic EventHandler<xyz> rồi thì chỉ cẩn tạo thêm 1 class xyz nữa là dùng được, không cần phải kế thừa EventArgs cũng không thấy ảnh hưởng gì.

tuandt34 đã bình luận 09:55 14-01-2022

Trước tiên cảm ơn kteam đã có những chia sẻ thật sự hữu ích.mình có 1 câu hỏi mong kteam giúp mình giải đáp.

Nếu như mình có 1 list cần duyệt qua bằng foreach trong đó mình khởi tạo mới HocSinh và mình muốn tất cả hs.NameChanged mới này chỉ sử dụng chung 1 cái Hs_NameChanged thì có cách nào để xử lý k? Cái NameChangedEventArgs này của mình liên tục cập nhật theo timer chẳng hạn

foreach(var list in lists)

{

HocSinh hs = new HocSinh();

            hs.NameChanged += Hs_NameChanged;

}

 

Thank các bạn!

MrBlackWings đã bình luận 21:47 18-01-2021

2 bài event thực sự khá khó hiểu, chỉ biết là khi nào có thay đổi thì cần ghi log để so sánh hoặc lưu giữ hoạt động thay đổi

Không có video.