Lập trình UD Desktop_12 - Tổng quan về CSDL

Bài trước: Lập trình UD Desktop_11 - Timer ProgressBar NumericUpDown Process DateTimePicker LinQ
-----

3         Lập trình cơ sở dữ liệu

3.1 Một số khái niệm

3.1.1       Cơ sở dữ liệu là gì?



Cơ sở dữ liệu (database) là một tập hợp thông tin có cấu trúc. Các thông tin này được duy trì dưới dạng một tập hợp các tập tin trong hệ điều hành, hoặc được lưu trữ trong các hệ quản trị cơ sở dữ liệu.

Ưu điểm của cơ sở dữ liệu:

– Giảm sự trùng lặp thông tin xuống mức thấp nhất

– Có thể truy xuất thông tin theo nhiều cách

– Cho phép nhiều người cùng sử dụng một lúc

Cơ sở dữ liệu phản ánh một phần của thế giới thật.

Có nhiều loại cơ sở dữ liệu, ví dụ:

Loại cơ sở dữ liệu
Đặc điểm
Cơ sở dữ liệu dạng file
Dữ liệu được lưu trữ dưới dạng các tập tin (text, ascii, .dbf).
Cơ sở dữ liệu quan hệ
Dữ liệu được lưu trữ trong các bảng dữ liệu gọi là các thực thể, giữa các thực thể này có mối liên hệ với nhau gọi là các quan hệ, mỗi quan hệ có các thuộc tính, trong đó có một thuộc tính là khóa chính. Các hệ quản trị hỗ trợ cơ sở dữ liệu quan hệ như: MS SQL server, Oracle, MySQL,…v.v.
Cơ sở dữ liệu hướng đối tượng
Dữ liệu cũng được lưu trữ trong các bảng dữ liệu, nhưng các bảng có bổ sung thêm các tính năng hướng đối tượng như lưu trữ thêm các hành vi, nhằm thể hiện hành vi của đối tượng. Mỗi bảng xem như một lớp dữ liệu, mỗi dòng dữ liệu trong bảng là một đối tượng. Các hệ quản trị có hỗ trợ cơ sở dữ liệu hướng đối tượng như: MS SQL server, Oracle, PostgreSQL (viết tắt Postgres).
Cơ sở dữ liệu bán cấu trúc
Dữ liệu được lưu dưới dạng XML, với định dạng này, thông tin mô tả về đối tượng thể hiện trong các thẻ (tag). Đây là cơ sở dữ liệu có nhiều ưu điểm, do lưu trữ được hầu hết các loại dữ liệu khác nhau. Đây là hướng mới trong nghiên cứu và ứng dụng

Bảng dưới đây là danh sách các cơ sở dữ liệu phổ biến đang được mọi người sử dụng,

Cơ sở dữ liệu
Tỉ lệ
Cơ sở dữ liệu
Tỉ lệ
MySQL
58.7%
Memcached
5.5%
SQL Server
41.2%
Amazon DynamoDB
5.2%
PostgreSQL
32.9%
Amazon RDS/Aurora
5.1%
MongoDB
25.9%
Cassandra
3.7%
SQLite
19.7%
IBM Db2
2.5%
Redis
18.0%
Neo4j
2.4%
Elasticsearch
14.1%
Amazon Redshift
2.2%
MariaDB
13.4%
Apache Hive
2.2%
Oracle
11.1%
Google BigQuery
2.1%
Microsoft Azure (Tables, CosmosDB, SQL, etc)
7.9%
Apache Hbase
1.7%
Google Cloud Storage
5.5%



3.1.2       Hệ quản trị cơ sở dữ liệu là gì?

Theo vi.wiki:

Hệ quản trị cơ sở dữ liệu (tiếng Anh: Database Management System – DBMS) là phần mềm hay hệ thống được thiết kế để quản trị một cơ sở dữ liệu.

Các DBMS cho phép lưu trữ, sửa chữa, xóa và tìm kiếm thông tin trong một cơ sở dữ liệu. Có nhiều loại DBMS khác nhau: từ phần mềm nhỏ chạy trên máy tính cá nhân đến những hệ quản trị phức tạp chạy trên một hoặc nhiều siêu máy tính.

Đa số các DBMS đều sử dụng ngôn ngữ truy vấn theo cấu trúc, tiếng Anh gọi là Structured Query Language (SQL).

Các DBMS phổ biến gồm: mySQL, Oracle, PostgreSQL, SQL server, DB2, Infomix.

Phần lớn các DBMS hoạt động tốt trên nhiều hệ điều hành khác nhau như Linux, Unix mà MacOS, trừ SQL server của Microsoft chỉ chạy trên hệ điều hành Windows.


3.1.3       Cài đặt SQL Server


Chọn phiên bản nào[1]?

SQL Server hiện có nhiều phiên bản khác nhau. Dưới đây là danh sách các phiên bản cùng với tính năng của từng phiên bản.

Enterprise
bản cao cấp nhất với đầy đủ tính năng
Standard
ít tính năng hơn Enterprise, sử dụng khi không cần dùng tới các tính năng nâng cao
Workgroup
phù hợp cho các công ty lớn với nhiều văn phòng làm việc từ xa
Web
thiết kế riêng cho các ứng dụng web
Developer
tương tự như Enterprise nhưng chỉ cấp quyền cho một người dùng duy nhất để phát triển, thử nghiệm, demo. Có thể dễ dàng nâng cấp lên bản Enterprise mà không cần cài lại
Express
bản này chỉ dùng ở mức độ đơn giản, tối đa 1 CPU và bộ nhớ 1GB, kích thước tối đa của cơ sở dữ liệu là 10GB (miễn phí, nhẹ, phù hợp để học)
Compact
nhúng miễn phí vào các môi trường phát triển ứng dụng web. Kích thước tối đa của cơ sở dữ liệu là 4GB
Datacenter
thay đổi lớn trên SQL Server 2008 R2 chính là bản Datacenter Edition. Không giới hạn bộ nhớ và hỗ trợ hơn 25 bản cài
Business Intelligence
Business Intelligence Edition mới được giới thiệu trên SQL Server 2012. Phiên bản này có các tính năng của bản Standard và hỗ trợ một số tính năng nâng cao về BI như Power View và PowerPivot nhưng không hỗ trợ những tính năng nâng cao về mức độ sẵn sàng như AlwaysOn Availability Groups…
Enterprise Evaluation
bản SQL Server Evaluation Edition là lựa chọn tuyệt vời để dùng được mọi tính năng và có được bản cài miễn phí của SQL Server để học tập và phát triển. Phiên bản này có thời gian hết hạn là 6 tháng từ ngày cài

Danh sách các bản SQL server theo thời gian[2]

SQL Server 2017
SQL Server 2016
SQL Server 2014
SQL Server 2012
SQL Server 2008 R2                           
SQL Server 2008
SQL Server 2005
SQL Server 2000
SQL Server 7.0

Tải nguồn

SQL server 2008 express (SQLEXPRADV_x64_ENU.exe, dung lượng ~1GB)

Lưu ý: nếu lấy SQLEXPR_x86_ENU.exe (89.1 MB) hoặc SQLEXPR_x64_ENU.exe (82.5 MB hoặc SQLEXPR32_x86_ENU.exe (61.1 MB) sẽ bị thiếu Microsoft SQL Server Management Studio.


Hướng dẫn cài đặt SQL server 2008 express: https://www.youtube.com/watch?v=mxWiiyb-rBE

Hướng dẫn cài đặt SQL server 2017 express: https://viblo.asia/p/tong-quan-va-cach-cai-dat-cua-ms-sql-server-3P0lPzJGKox

Lab 19. Lựa chọn phiên bản và cài đặt SQL Server

<///// hết buổi 14



[1] https://quantrimang.com/cac-phien-ban-ms-sql-server-145297
[2] https://sqlserverbuilds.blogspot.com/
-----
Tiếp theo: Lập trình UD Desktop_13 - Tạo CSDL và giao diện
Xem thêm: Danh sách các bài học

Lập trình UD Desktop_11 - Timer ProgressBar NumericUpDown Process DateTimePicker LinQ

Bài trước: Lập trình UD Desktop_10 - Thread
-----

2.21       Timer



Control Timer có một method quan trọng là Tick(), method này sẽ được thực thi sau mỗi khoảng thời gian được thiết lập trong thuộc tính Interval.

Để khởi chạy Timer, gọi hàm Start(). Để dừng Timer, gọi hàm Stop().

Đoạn mã minh họa, chương trình đếm số,
        int i = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
                label1.Text = i.ToString();
                i++;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!timer1.Enabled)
            {
                timer1.Start();
                button1.Text = "Dừng";
            }
            else
            {
                timer1.Stop();
                button1.Text = "Bắt đầu";
            }
           
        }
[Giao diện chương trình]



2.22       ProgressBar




Một số thuộc tính quan trọng:

– Minimum và Maximum: là miền giá trị của thanh trượt, hay kích thước của thanh trượt

– Step: là giá trị của mỗi bước nhảy, hay kích thước của bước nhảy

– PerformStep(): thực hiện bước nhảy trên thanh trượt

– Style: kiểu trượt

Ví dụ, tạo một progressbar chạy theo timer,

[Đoạn mã tham khảo]

  private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            progressBar1.PerformStep();
        }
[Giao diện]



2.23       NumericUpDown



Control NumericUpDown công cụ được sử dụng để tạo một ô nhập liệu, cho phép điều chỉnh giá trị số tăng hoặc giảm.

Một số thuộc tính quan trọng của NumericUpDown:

– Minimum: giá trị nhỏ nhất

– Maximum: giá trị lớn nhất

– Increment: giá trị mỗi lần tăng hoặc giảm

<///// hết buổi 12

2.24       Process



Cần khai báo using System.Diagnostics; để sử dụng.

Ví dụ,

void LayCacProcess()
        {
            Process [] processArr = Process.GetProcesses();
            foreach(Process item in processArr)
            {
                textBox1.Text = item.ProcessName + "\n" + textBox1.Text;
            }
        }

Để chạy một chương trình khác sử dụng hàm Start, ví dụ,

Process.Start("regedit");

Hoặc

Process.Start("notepad.exe");

Đoạn mã sau khởi chạy một chương trình ở dạng ẩn,

Process p = new Process();
            p.StartInfo.FileName = "notepad.exe";
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.Start();

2.25       DateTimePicker



Công cụ dùng để lấy giờ.

Có thể định dạng kiểu hiển thị của ngày, giờ trong thuộc tính Format hoặc CustomFormat (với điều kiệu thuộc tính Format được thiết lập là Custom).

Để tùy chỉnh cách hiển thị của datatimepicker, thiết lập trong thuộc tính ShowUpDown = true.

Để gán dữ liệu cho datetimepicker,

dateTimePicker1.Value = new DateTime(2018,11,29);

Để lấy dữ liệu từ datatimepicker,

DateTime date = dateTimePicker1.Value;

2.26       LinQ



LinQ (viết tắt của Language Integrated Query) là một thư viện được tích hợp trong Framework .NET 3.5. Hiểu nôm na, LinQ là tích hợp SQL vào C#, giúp truy vấn dữ liệu ngay trong C#.

Với các kiểu dữ liệu mảng hoặc danh sách, khi muốn lọc một số dữ liệu từ trong mảng/danh sách thường phải sử dụng các vòng lặp, so sánh với điều kiện cho trước, nếu thỏa điều kiện thì lấy ra và lưu vào mảng/danh sách mới. Cách làm này phức tạp, tốn thời gian, thay vì vậy có thể sử dụng LinQ.

LinQ đang hỗ trợ các công nghệ sau:

– SQL Server databases: LinQ to SQL

– XML documents: LinQ to XML

– ADO.NET datasets: LinQ to DataSet

– .NET collections, strings, files,…: LinQ to Objects

– Entity Framework: LinQ to Entities

Xem hình minh họa,



Đọc thêm về LinQ ở đây: https://trachanhso.net/linq-la-gi/


Lab 18. Tạo một ứng dụng đơn giản có sử dụng thư viện LinQ.

[Giao diện]



Giao diện gồm: textBox để nhập món ăn cần tìm (txtKey), một button có tên là “Tìm món ăn” (btnSearch), một comboBox để liệt kê tên các món ăn (cbData, để thuộc tính DropDownStyle là Simple), một comboBox để hiển thị kết quả tìm kiếm (cbResult, để thuộc tính DropDownStyle là Simple), và hai label.

[Tạo dữ liệu cho ứng dụng]

List<Food> foodList;
        public Form1()
        {
            InitializeComponent();
            LoadFood();
        }
        void LoadFood()
        {
            foodList = new List<Food>();
            foodList.Add(new Food("Bánh tráng trộn", "7000"));
            foodList.Add(new Food("Kem trái cây", "15000"));
            foodList.Add(new Food("Chè Thái", "10000"));
            foodList.Add(new Food("Chè chuối", "8000"));
            foodList.Add(new Food("Bánh tráng hành", "5000"));
            foodList.Add(new Food("Xắp xắp", "6000"));
            foodList.Add(new Food("Bánh bao chiên", "5000"));

            cbData.DataSource = foodList;
            cbData.DisplayMember = "Name";
        }
    }

    public class Food
    {
        private string name;
        private string price;

        public string Price
        {
            get { return price; }
            set { price = value; }
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public Food() { }
        public Food(string name, string price)
        {
            this.Name = name;
            this.Price = price;
        }
    }

[Một số chức năng tìm kiếm, sử dụng LinQ]

– Tìm phần tử

private void btnSearch_Click(object sender, EventArgs e)
        {
            List<Food> result = new List<Food>();

            // cách tìm kiếm dùng vòng lặp
            //foreach(Food item in foodList)
            //{
            //    if(item.Name == txtKey.Text)
            //    {
            //        result.Add(item);
            //    }
            //}

            // dùng LinQ
            result = foodList.Where(p => p.Name == txtKey.Text).ToList();
            // ý là: tìm trong foodList mọi p, sao cho (=>) p.Name == txtKey, sau đó chuyển thành List

            cbResult.DataSource = result;
            cbResult.DisplayMember = "Name";
        }

– Lấy mọi phần tử

result = foodList.Select(p => p).ToList();

– Lấy một kết quả đầu tiên

var result2 = foodList.Select(p => p.Name).SingleOrDefault();

– Phân trang bằng Skip(n) và Take(n)

Skip(n): là bỏ qua n phần tử. Take(n) : là lấy n phần tử
var result2 = foodList.Select(p => p).Skip(3).Take(2).ToList();

– Sắp xếp dữ liệu (ví dụ theo Name)

var result2 = foodList.OrderBy(p => p.Name).ToList();      


Bài học về EntityFrameWork sẽ học sau khi làm loạt bài về Cơ sở dữ liệu trong dự án Quản lý quán cà phê.


// bắt đầu kiểm tra lấy điểm thành phần (điểm danh, tài liệu ghi chép, bài thực hành)

<///// hết buổi 13
-----
Tiếp theo: Lập trình UD Desktop_12 - Tổng quan về CSDL
Xem thêm: Danh sách các bài học

Lập trình UD Desktop_10 - Thread

Bài trước: Lập trình UD Desktop_09 - ContextMenu NotifyIcon
-----

2.20       Thread


Nhân tiện, ôn lại một chút kiến thức của môn Hệ điều hành. Để ý là các môn học Nhập môn ngành CNTT, Kiến trúc máy tính, Hệ điều hành, Kĩ thuật lập trình, Cấu trúc dữ liệu và thuật toán, Mạng máy tính, Lập trình hướng đối tượng và các môn học khác, là những nền tảng quan trọng, giúp người học hiểu về chính cái máy tính. Mình có hiểu về máy tính thì mới thích, mới có thể điều khiển được nó.

– Khi lấy một phần mềm từ Internet về máy (ví dụ Microsoft Office, Visual Studio Code) thì phần mềm đó tồn tại dưới dạng một tập tin

– Sau khi cài đặt, thì phần mềm đó tồn tại dưới dạng một chương trình được lưu trên đĩa cứng

– Khi chạy chương trình đó trên máy tính, thì sẽ tạo ra một tiến trình (process)

– Trong một tiến trình có thể có nhiều chương trình con đang chạy gọi là tiểu trình (hay luồng) (thread)

– Cùng một lúc máy tính có thể chạy nhiều tiến trình (hay nhiều chương trình)

Vậy, tiến trình là một chương trình đang được thực thi, trong một tiến trình có thể có nhiều “tiến trình con” đang chạy cùng lúc gọi là các tiểu trình.

Một tiến trình thường gồm:

– Định danh: để phân biệt với các tiến trình khác

– Trạng thái: thể hiện trạng thái hiện thời

– Độ ưu tiên: xác định độ ưu tiên của tiến trình

– Giá trị của thanh ghi PC: địa chỉ của lệnh kế tiếp sẽ được thực thi.

– Các địa chỉ tham chiếu: tới vùng mã, vùng dữ liệu

– Thông tin trạng thái: thông tin trong các thanh ghi

– Thông tin trạng thái nhập/xuất

– Các thông tin thống kê (accounting information)

– Các thông tin trên được lưu trong PCB (process control block)

Một tiểu trình:

– Là đơn vị xử lý cơ bản trong hệ thống

– Xử lý tuần tự đoạn mã của nó

– Sở hữu một con trỏ lệnh, một tập các thanh ghi và một vùng nhớ stack riêng

– Cũng chia sẻ thời gian xử lý của processor như các tiến trình

– Một tiến trình có thể có nhiều tiểu trình 

Xem hai hình sau cho dễ hiểu,



và,



Hiểu lý thuyết rồi giờ sẽ áp dụng vào lập trình, xem clip sau,

Sau bài học này bạn sẽ:

– Hiểu được khái niệm thread, deadlock, main thread

– Tạo được nhiều thread trong winform

Trong một dự án, vào tập tin Program.cs để xem luồng (thread) chính, một chương trình luôn có một luồng chính,

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

Để tạo thêm luồng mới cần làm một số việc sau:

– Khai báo đầu vào của luồng, ví dụ đầu vào của luồng chính là hàm demXuoi,

ThreadStart ts = new ThreadStart(demXuoi);

– Tạo ra một luồng, dựa trên đầu vào đã có,

Thread thr = new Thread(ts);

– Khởi chạy luồng vừa được tạo ra,

thr.Start();

Để các luồng có thể dùng chung tài nguyên trên form (control, hoặc biến) của nhau có thể thiết lập việc kiểm tra tài nguyền dùng chung là fasle, tuy nhiên cách này dễ làm chương trình bị treo,         

Control.CheckForIllegalCrossThreadCalls = false;

Học thêm về delegate, lambda expression, anonymous function ở đây :

Lambda expression là cách ngắn gọn để viết một anonymous function. Anonymous function là một hàm không có tên. Hàm không có tên này được dùng để gán cho một biến, hoặc được xem như là một biến.

Cú pháp của lambda expression là:

( input-parameters ) => { statement }

Ví dụ, từ hai hàm sau,

        private void button1_Click(object sender, EventArgs e)
        {
            ThreadStart ts1 = new ThreadStart(demXuoi);
            Thread thr1 = new Thread(ts1);
            thr1.Start();
        }

        void demXuoi()
        {
            for(int i = 0; i < Convert.ToInt32(textBox1.Text); i++)
            {
                label1.Text = i.ToString();
            }
        }

Sử dụng kiểu viết Lambda expression để gộp lại như sau,

        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(
                () =>
                    {
                        for (int i = 0; i < Convert.ToInt32(textBox1.Text); i++)
                        {
                            label1.Text = i.ToString();
                        }
                    }
                ).Start();
        }

Trong đó,

– () là một anonymous function, không có tham số truyền vào

– => là chỉ dẫn, có nghĩa là “sau đây là phần định nghĩa của hàm”

– {} nội dung của hàm

Lab 17. Tạo chương trình đếm số

[Tạo giao diện như sau]



[Yêu cầu chức năng]

– Cho người dùng nhập một số, sau đó bấm vào nút Luồng 1 – Đếm xuôi và Luồng 2 – Đếm ngược, quá trình đếm số sẽ được hiển thị ở hai label ĐẾM XUÔI và ĐẾM NGƯỢC.

– Viết xử lý cho nút [Luồng 1 – Đếm xuôi] bằng kiểu thông thường

– Viết xử lý cho nút [Luồng 2 – Đếm ngược] có sử dụng Lambda expression

[Giao diện khi đang chạy]


-----
Tiếp theo: Lập trình UD Desktop_11 - Timer ProgressBar NumericUpDown Process DateTimePicker LinQ
Xem thêm: Danh sách các bài học

Lập trình UD Desktop_09_ContextMenu NotifyIcon

Bài trước: Lập trình UD Desktop_08_ToolTip StatusBar
-----

2.18       ContextMenu


Tham khảo clip về ContextMenu


Context menu (trình đơn theo ngữ cảnh) là trình đơn hiện ra khi người dùng bấm chuột phải vào một đối tượng trên màn hình giao diện.

Trong cửa sổ thiết kết của Visual Studio, để tạo ra một context menu sử dụng control có tên là ContextMenuStrip.

Để hiển thị context menu, cần sử dụng phương thức show(), hoặc gắn vào một control, khi người dùng bấm chuột phải vào control, menu sẽ được hiển thị.

Ví dụ 1, để gắn context menu có tên là contextMenuStrip1 vào một textbox, trong cửa sổ Properties của textbox, chọn thuộc tính ContextMenuStrip, thiết lập giá trị là contextMenuStrip1.

Ví dụ 2, để tạo và hiển thị context menu khi người dùng bấm chuột phải vào textbox, mà không sử dụng cách gắn thuộc tính như ở Ví dụ 1, thì làm như sau,

public partial class Form1 : Form
    {
        ContextMenuStrip contextMenu2;
        public Form1()
        {
            InitializeComponent();
            contextMenu2 = new ContextMenuStrip();
            contextMenu2.Items.Add("Copy");
            contextMenu2.Items.Add("Paste");
        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(this.textBox2, new Point(0,0), ToolStripDropDownDirection.AboveRight);
            }
        }
    }

Để không hiển thị một cái context menu mặc định gồm rất nhiều các mục chọn khác, cần thiết lập thuộc tính ShortcutsEnabled của textBox2 là False.

Tuy nhiên, cách khai báo các mục trong context menu theo kiểu,

contextMenu2.Items.Add("Copy");
contextMenu2.Items.Add("Paste");

sẽ không viết hàm xử lý cho sự kiện “người dùng bấm chuột vào mục Copy hoặc Paste” được. Mà phải viết như sau:

contextMenu2 = new ContextMenuStrip();
            var itemCopy = new ToolStripButton() { Text = "Copy" };
            var itemPaste = new ToolStripButton() { Text = "Paste" };
            itemCopy.Click += itemCopy_Click;
            itemPaste.Click += itemPaste_Click;
            contextMenu2.Items.Add(itemCopy);
            contextMenu2.Items.Add(itemPaste);

void itemCopy_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Copying");
        }
        void itemPaste_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Pasting");
        }

Lab 15. Tạo context menu cho chương trình File Explorer

Quan sát các chức năng View, Copy và Paste của chương trình File Explorer. Làm ba chức năng này cho chương trình giả lập File Explorer (tối thiểu phải làm được hết các chức năng cho View). Gồm các công việc sau:

– Phân tích và mô tả yêu cầu (viết vào tập tin ghi chép môn học)

– Viết tài liệu quá trình thực hiện (viết vào tập tin ghi chép môn học)

– Lập trình, chạy thử

– Viết tài liệu hướng dẫn sử dụng (viết vào tập tin ghi chép môn học)

[Gợi ý, xem đoạn mã này rồi tìm cách nhúng vào trong dự án File Explorer]

public partial class Form1 : Form
    {
        ContextMenuStrip contextMenu2;
        public Form1()
        {
            InitializeComponent();
            contextMenu2 = new ContextMenuStrip();
            ToolStripMenuItem itemView = new ToolStripMenuItem() { Text = "View" };
            ToolStripMenuItem itemLargeIcons = new ToolStripMenuItem() { Text = "LargeIcons" };
            itemView.DropDownItems.Add(itemLargeIcons);
            itemLargeIcons.Click += itemLargeIcons_Click;
            contextMenu2.Items.Add(itemView);
        }
        void itemLargeIcons_Click(object sender, EventArgs e)
        {
            MessageBox.Show("LargeIcon");

        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(this.textBox2, new Point(0, 0), ToolStripDropDownDirection.AboveRight);
            }
        }
    }

Có thể thiết lập vị trí hiển thị context menu ngay tại vị trí của con trỏ chuột:

private void lvExplorer_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(MousePosition);
            }
        }

[Màn hình kết quả]


<///// hết buổi 11

2.19       NotifyIcon




NotifyIcon được sử dụng để ẩn chương trình đang chạy xuống dưới khay hệ thống (system tray), dưới dạng một biểu tượng, người dùng có thể tương tác với chương trình thông qua biểu tượng này.

Hai yêu cầu cần nắm được:

– Gửi được dữ liệu từ form xuống icon (trong system tray)

– Gửi ngược dữ liệu từ icon (trong system tray) lên form

Lab 16. Xử lý NotifyIcon cho chương trình File Explorer

[Mô tả yêu cầu]

– Thêm mục “Ẩn chương trình” trên thanh menu (mục này nằm bên phải mục View)

– Khi người dùng bấm vào mục “Ẩn chương trình” thì ẩn cửa sổ chương trình File Explorer trên màn hình máy tính, đồng thời hiển thị một icon ở System tray và hiển thị một câu thông báo với nội dung “Chương trình File Explorer đang chạy ngầm”

– Khi người dùng bấm chuột trái vào icon của File Explorer ở System tray thì hiển thị cửa sổ chương trình File Explorer trên màn hình máy tính

– Khi người dùng bấm chuột phải vào icon của File Explorer ở System tray thì hiển thị context menu, trong context menu gồm các chế độ view khác nhau (LargeIcon, SmallIcon, Details, Tile, List). Nếu người dùng chọn một chế độ xem bất kì thì thay đổi chế độ xem của File Explorer.

[Đoạn mã tham khảo]

private void anChuongTrinhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            notifyIcon1.Visible = true;
            this.Hide();
            notifyIcon1.ShowBalloonTip(5000, "Thông báo", "Chương trình File Explorer đang chạy ngầm", ToolTipIcon.Info);
        }

        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left)
            {
                notifyIcon1.Visible = false;
                WindowState = FormWindowState.Normal;
                this.Show();
            }
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(MousePosition);
            }

        }

[xem hình minh họa]


-----