Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,... Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,...
BÀI 1: XỬ LÝ NGOẠI LỆ 1.1 Phát sinh bắt giữ ngoại lệ Trong ngôn ngữ C#, phát sinh (throw) đối tượng kiểu liệu System.Exception, hay đối tượng dẫn xuất từ kiểu liệu Namespace System CLR chứa số kiểu liệu xử lý ngoại lệ mà sử dụng chương trình Những kiểu liệu ngoại lệ bao gồm ArgumentNull - Exception, InValidCastException, OverflowException , nhiều lớp khác Câu lệnh throw Để phát tín hiệu khơng bình thường lớp ngôn ngữ C#, phát sinh ngoại lệ Để làm điều này, sử dụng từ khóa throw Dòng lệnh sau tạo thể System.Exception sau throw nó: throw new System.Exception(); Khi phát sinh ngoại lệ tức khắc làm ngừng việc thực thi CLR tìm kiếm trình xử lý ngoại lệ Nếu trình xử lý ngoại lệ khơng tìm thấy phương thức thời, CLR tiếp tục tìm phương thức gọi tìm thấy Nếu CLR trả lớp Main() mà khơng tìm thấy trình xử lý ngoại lệ nào, kết thúc chương trình Ví dụ: Throw ngoại lệ namespace Programming_CSharp { using System; public class Test { public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); Func2(); Console.WriteLine(“Exit Func1 ”); } public void Func2() { Console.WriteLine(“Enter Func2 ”); throw new System.Exception(); Console.WriteLine(“Exit Func2 ”); } } } Ví dụ minh họa đơn giản viết hình console thơng tin nhập vào hàm chuẩn bị từ hàm Hàm Main() tạo thể kiểu Test sau gọi hàm Func1() Sau in thông điệp “Enter Func1”, hàm Func1() gọi hàm Func2() Hàm Func2() in thông điệp phát sinh ngoại lệ kiểu System.Exception Việc thực thi ngưng tức khắc, CLR tìm kiếm trình xử lý ngoại lệ hàm Func2() Do khơng tìm thấy đây, CLR tiếp tục vào stack lấy hàm gọi trước tức Func1 tìm kiếm trình xử lý ngoại lệ Một lần Func1 khơng có đoạn xử lý ngoại lệ Và CLR trả hàm Main Tại hàm Main khơng có, nên CLR gọi trình mặc định xử lý ngoại lệ, việc đơn giản xuất thông điệp lỗi Câu lệnh catch Trong C#, trình xử lý ngoại lệ hay đoạn chương trình xử lý ngoại lệ gọi khối catch tạo với từ khóa catch Trong ví dụ sau, câu lệnh throw thực thi bên khối try, khối catch sử dụng để công bố lỗi xử lý namespace Programming_CSharp { using System; public class Test { public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); Func2(); Console.WriteLine(“Exit Func1 ”); } public void Func2() { Console.WriteLine(“Enter Func2 ”); try { Console.WriteLine(“Entering try block ”); throw new System.Exception(); Console.WriteLine(“Exiting try block ”); } Khi ngoại lệ phát sinh, việc thi hành bị tạm dừng việc thi hành chuyển qua khối lệnh catch Nó khơng trả luồng thực ban đầu, tức lệnh sau phát ngoại lệ khối try không thực Trong trường hợp không nhận thông báo “Exiting try block ” Khối lệnh catch xử lý lỗi sau chuyển việc thực thi chương trình đến lệnh tiếp sau khối catch Ở khơng có việc quay lại gọi hàm trước stack Ngoại lệ xử lý, khơng có vấn đề xảy ra, chương trình tiếp tục hoạt động bình thường Điều trở nên rõ ràng di chuyển khối try/catch lên hàm Func1 ví dụ minh họa namespace Programming_CSharp { using System; public class Test { public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); try { Console.WriteLine(“Entering try block ”); Func2(); Console.WriteLine(“Exiting try block ”); } catch { Console.WriteLine(“Exception caught and handled.”); } Console.WriteLine(“Exit Func1 ”); } public void Func2() { Console.WriteLine(“Enter Func2 ”); throw new System.Exception(); Console.WriteLine(“Exit Func2 ”); } Lúc ngoại lệ không xử lý bên hàm Func2(), mà xử lý bên hàm Func1() Khi hàm Func2() gọi, in câu lệnh thơng báo vào hàm phát sinh ngoại lệ Việc thực chương trình bị ngưng, CLR tìm kiếm phần xử lý ngoại lệ, hàm khơng có CLR vào stack lấy hàm gọi trường hợp Func1() Câu lệnh catch gọi, việc thực thi tiếp tục thực bình thường sau câu lệnh catch Hãy chắn hiểu rõ câu lệnh “Exiting try block” “Exit Func2” không in Chúng ta dùng cách cũ để kiểm tra việc cách dùng chương trình debug cho chương trình chạy bước để tìm hiểu rõ Tạo khối catch xác định: Ở ta dùng khối catch tổng quát, tức với ngoại lệ Tuy nhiên tạo khối catch xác định để xử lý vài ngoại lệ toàn ngoại lệ, dựa kiểu ngoại lệ phát sinh Trong ví dụ này, phương thức DoDivide() không cho phép chia cho zero số khác, không cho phép chia số zero Nó phát sinh đối tượng Divide- ByzeroException thực chia với zero Trong toán học việc lấy zero chia cho số khác phép, ví dụ minh họa không cho phép thực việc này, thực phát sinh ngoại lệ ArithmeticException Khi ngoại lệ phát sinh, CLR kiểm tra khối xử lý ngoại lệ theo thứ tự lấy khối thích hợp Khi thực với a=5 b=7 kết sau: / = 0.7142857142857143 Như mong muốn, khơng có ngoại lệ phát sinh Tuy nhiên, thay đổi giá trị a 0, kết là: ArithmeticException caught! Ngoại lệ phát sinh, CLR kiểm tra ngoại lệ đầu tiên: DivideByZeroException Bởi khơng phù hợp, nên tiếp tục tìm khối xử lý ArithmeticException chọn Cuối cùng, giả sử thay đổi giá trị b Khi thực điều dẫn đến ngoại lệ DivideByZeroException !Ghi chú: Chúng ta phải cẩn thận thứ tự câu lệnh catch, DivideByZero- Exception dẫn xuất từ ArithmeticException Nếu đảo thứ tự câu lệnh catch, ngoại lệ DivideByZeroException phù hợp với khối xử lý ngoại lệ Arith- meticException Và việc xử lý ngoại lệ không giao cho khối xử lý DivideByZeroException Thật vậy, thứ tự đảo, khơng cho phép ngoại lệ xử lý khối xử lý ngoại lệ DivideByZeroException Trình biên dịch nhận DivideByZeroException khơng thực thơng báo lỗi biên dịch Chúng ta phân phối câu lệnh try/ catch, cách bắt giữ ngoại lệ xác định hàm nhiều ngoại lệ tổng quát nhiều hàm Mục đích thực đưa thiết kế Giả sử có phương thức A, phương thức gọi phương thức khác tên phương thức B, đến lượt phương thức B gọi phương thức C Và phương thức C tiếp tục gọi phương thức D, cuối phương thức D gọi phương thức E Phương thức E mức độ sâu chương trình chúng ta, phương thức A, B mức độ cao Nếu đoán trước phương thức E phát sinh ngoại lệ, tạo khối try/catch để bắt giữ ngoại lệ chỗ gần nơi phát sinh ngoại lệ Chúng ta tạo nhiều khối xử lý ngoại lệ chung đoạn chương trình mức cao trường hợp ngoại lệ khơng đốn trước 1.2 Những đối tượng ngoại lệ Cho đến lúc sử dụng tốt ngoại lệ cách xử lý khắc phục ngoại lệ Trong phần tiến hành việc tìm hiểu đối tượng xây dựng cho việc xử lý ngoại lệ Đối tượng System.Exception cung cấp số phương thức thuộc tính hữu dụng Thuộc tính Message cung cấp thông tin ngoại lệ, lý ngoại lệ phát sinh Thuộc tính Message thuộc tính đọc, đoạn chương trình phát sinh ngoại lệ thiết lập thuộc tính Message đối mục cho khởi dựng ngoại lệ Thuộc tính HelpLink cung cấp liên kết để trợ giúp cho tập tin liên quan đến ngoại lệ Đây thuộc tính đọc Thuộc tính StackTrace thuộc tính đọc thiết lập CLR Trong ví dụ 13.6 thuộc tính Exception.HelpLink thiết lập truy cập để cung cấp thông tin cho người sử dụng ngoại lệ DivideBy-ZeroException Thuộc tính StackTrace ngoại lệ sử dụng để cung cấp thông tin stack cho câu lệnh lỗi Một thông tin stack cung cấp hàng loạt gọi stack phương thức gọi mà dẫn đến ngoại lệ phát sinh namespace Programming_CSharp { using System; public class Test { public static void Main() { Test t = new Test(); t.TestFunc(); } // chia hai số xử lý ngoại lệ Public void TestFunc() { Try { Console.WriteLine(“ Open file here”); Double a=12; Double b=0; Console.WriteLine(“ {0}/{1} = {2}”,a,b,a/b); } catch (System.DivideByZeroException e) { Console.WriteLine(“\nDivideByZeroException!Msg: {0},e.Message”); } catch { Console.WriteLine(“ ko xac dinh”); } public double DoDivide(double a,double b) { if(b==0) { DivideByzeroException e = new DivideByZeroExceptin(); throw e; } If (a==0) { throw new ArithmeticException(); } Return a/b; } } Một số lớp ngoại lệ: CÁC LỚP NGOẠI LỆ Tên ngoại lệ MethodAccessException ArgumentException ArgumentNullException arithmeticException DivideByZeroException FormatException IndexOutOfRangeExceptio n OverflowException Mô tả Lỗi truy cập, truy cập đến thành viên hay phương thức không truy cập Lỗi tham số đối mục Đối mục null, phương thức truyền đối mục null không chấp nhận Lỗi liên quan đến phép toán Lỗi chia Định dạng khơng xác đối mục Phép gán khơng hợp lệ Lỗi tràn phép tốn 1.3 Phát sinh lại ngoại lệ Giả sử muốn khối catch thực vài hành động sau phát sinh lại ngoại lệ bên khối catch (trong hàm gọi) Chúng ta phép phát sinh lại ngoại lệ hay phát sinh lại ngoại lệ khác Nếu phát sinh ngoại lệ khác, phải nhúng ngoại lệ ban đầu vào bên ngoại lệ để phương thức gọi hiểu lai lịch nguồn gốc ngoại lệ Thuộc tính InnerException ngoại lệ cho phép truy cập ngoại lệ ban đầu BÀI 2: VISUAL STUDIO.NET 2.1 Lập trình với Visual Studio NET Microsoft Visual Studio NET ngơn ngữ hướng thành phần (component) mạnh C# đóng vai trò quan trọng kiến trúc NET Framework Microsoft Visual Studio.NET mơi trường lập trình cung cấp nhiều công cụ cần thiết cho việc xây dựng dự án lớn nhỏ Thanh trình đơn (menu bar) cho phép truy cập đến lệnh sử dụng mơi trường lập trình Thanh cơng cụ (toolbar) nằm bên trình đơn cung cấp nút truy cập nhanh đến hầu hết lệnh thường dùng Khung cửa sổ soạn thảo (code pane) hiển thị nội dung tập nguồn, dự án có nhiều tập tin, tập tin nguồn có thẻ riêng với nhãn tên tập tin nguồn Để thao tác tập tin nguồn việc bấm chọn lên thẻ tập tin nguồn dự án Khung cửa sổ kết xuất (Output pane) hiển thị thông điệp biên dịch (bao gồm cảnh báo thông báo lỗi) tạo dựng (build) lệnh Trước viết mã (coding) cần kiểm tra tập tin khung cửa sổ Solution Explorer, chúng tạo Visual Studio.NET tạo dựng dự án Ví dụ tạo dự án có tên TextHello xuất số tập tin sau: TextHello.shn: tập tin giải pháp (solution file) cấp cùng, ứng dụng có tập tin loại Mỗi tập tin giải pháp gồm hay nhiều tập tin dự án Trong hệ thống tập tin, tập tin giải pháp có phần mở rộng shn, với phần tên hiển thị Solution Explorer thường dễ đọc TextHello.csproj: tập tin dự án (project) C# Mỗi tập tin dự án gồm hay nhiều tập tin nguồn, tập tin nguồn dự án phải viết ngôn ngữ Loại tập tin hiển thị Solution Explorer sử dụng tên dự án, nhiên lưu hệ thống tập tin với phần mở rộng csproj Class1.cs: tập tin nguồn khác C#, ta viết mã tập tin này, Visual Studio.NET tự động cung cấp số mã lệnh (code) cho tập tin AssemblyInfo.cs: tập tin nguồn khác C#, dùng tập tin để thêm số thuộc tính vào chương trình App.ico: tập tin icon kết hợp với chương trình, tất ứng dụng windows có giao diện người dùng có icon, xuất tác vụ (taskbar) chạy chương trình Các ứng dụng NET: trình bày thơng qua hình sau: 10 private void button2_Click(object sender, EventArgs e) { DataGridViewRow dgViewRow = dataGridView1.CurrentRow; label1.Text = "CurrentRow Property: " + Convert.ToString(dgViewRow.Cells[0].Value) + "-" + Convert.ToString(dgViewRow.Cells[1].Value) + Convert.ToString(dgViewRow.Cells[2].Value); } * Thuộc tính CurrentCell Khi muốn lấy giá trị chọn, sử dụng thuộc tính CurrentCell: private void button3_Click(object sender, EventArgs e) { DataGridViewCell dataGridViewCell = dataGridView1.CurrentCell; label1.Text = "CurrentRow Property: " + Convert.ToString(dataGridViewCell.Value); } Ngồi ta biết số lượng cột hàng liệu trình bày điều khiển DataGridView cách sử dụng thuộc tính ColumnCount Rows.Count: private void button1_Click(object sender, EventArgs e) { label1.Text = "ColumnCount Property: " + Convert.ToString(dataGridView1.ColumnCount); label1.Text += "-Rows.Count Property: " + Convert.ToString(dataGridView1.Rows.Count); } 9.3.6 Đối tượng BindingSource Thay phải khai báo để liệt kê danh sách ghi bảng người sử dụng di chuyển ghi bảng cha ta sử dụng đối tượng BindingSource với đối tượng DataSet: Khai báo sử dụng đối tượng BindingSource: void MakeBindingSource(BindingSource bindingParent, BindingSource bindingChild) { Databases cls = new Databases(); string parentSQL = "select DeptID,"+ "DeptName from tblDepartments"; 102 string childSQL = "select FirstName,"+ "Lastname,* from tblContracts C, "+ "tblEmployees E where E.EmployeeID=" + " C.EmployeeID"; DataSet dataSet = cls.FillDataSet( parentSQL, "tblDepartments", childSQL, "tblContracts", CommandType.Text); DataColumn pk = dataSet.Tables[0].Columns[0]; DataColumn fk = dataSet.Tables[1].Columns[15]; DataRelation dr = new DataRelation("Relation", pk, fk, true); dataSet.Relations.Add(dr); bindingParent.DataSource = dataSet; bindingParent.DataMember = "tblDepartments"; bindingChild.DataSource = bindingParent; bindingChild.DataMember = "Relation"; } Gọi phương thức MakeBindingSource: private void button1_Click(object sender, EventArgs e) { try { BindingSource bindingParent = new BindingSource(); BindingSource bindingChild = new BindingSource(); MakeBindingSource(bindingParent, bindingChild); dataGridView1.DataSource = bindingParent; dataGridView2.DataSource = bindingChild; } catch (Exception ex) { MessageBox.Show(ex.Message); } 9.4 Thao tác với liệu Đối tượng Dataset DataTable đại diện cho kiến trúc không kết nối sở liệu, sau điền liệu vào đối tượng DataSet từ sở liệu nguồn cho phép sử dụng thêm mới, cập nhật hay sửa, xóa chúng Sau có nhu cầu muốn cập nhật trở lại sở liệu sử dụng phương thức Update đối tượng SqlDataAdapter 103 9.4.1 Thêm liệu Cho form sau, sau nhập thông tin vào textbox, để thêm liệu vào sở liệu, nhấn nút Lưu liệu cập nhật vào sở liệu, đồng thời hiển thị lên DataGridView private void bntLuu_Click(object sender, EventArgs e) { try { if (txtmaCT.Text == "") { MessageBox.Show("Chưa nhập mã cty!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error); txtmaCT.Focus(); } else { string sqlncc = "insert into NHACUNGCAP (macongty,tencongty,tengiaodich,diachi,dienthoai,fax,email ) values('" + txtmaCT.Text + "','" + txtTenCT.Text + "','" + txtTenGD.Text + "','" + txtDC.Text + "','" + txtDT.Text + "','" + txtFax.Text + "','" + txtEmail.Text + "')"; SqlCommand cmd = new SqlCommand(); cmd.CommandText = sqlncc; 104 ketnoi KN = new ketnoi(FrmLogIn.server1, FrmLogIn.data1, FrmLogIn.user1, FrmLogIn.pass1); cmd.Connection = KN.Layconn(); KN.thucthi(); cmd.ExecuteNonQuery(); thongbao TB = new thongbao(); TB.Thanhcong(); load(); } } catch { thongbao tb = new thongbao(); tb.Loi(); } } private void bnttrove_Click(object sender, EventArgs e) { this.Close(); } public void load() { string sql = "select * from NHACUNGCAP"; ketnoi KN = new ketnoi(FrmLogIn.server1, FrmLogIn.data1, FrmLogIn.user1, FrmLogIn.pass1); KN.Layconn(); KN.thucthi(); SqlDataAdapter da = new SqlDataAdapter(sql, KN.Layconn()); DataTable tbl = new DataTable("dataGridView1"); da.Fill(tbl); dataGridView1.DataSource = tbl.DefaultView; } private void FrmNCC_Load(object sender, EventArgs e) { load(); } 9.4.2 Update liệu private void bntsua_Click(object sender, EventArgs e) { 105 if (txtmaCT.Text == "") MessageBox.Show("Chua nhap ma cong ty"); else { string sql = "update NHACUNGCAP set tencongty= N'" + txtTenCT.Text + "',tengiaodich = N'" + txtTenGD.Text + "',diachi = N'" + txtDC.Text + "',dienthoai = '" + txtDT.Text + "',fax = '" + txtFax.Text + "',email = '" + txtEmail.Text + "'where macongty = '" + txtmaCT.Text + "'"; //string connecstring = "server=PCPC\\SQLEXPRESS;database=QLBH;UID=sa;PWD=123456"; //SqlConnection conn = new SqlConnection(connecstring); //conn.Open(); ketnoi KN = new ketnoi(FrmLogIn.server1, FrmLogIn.data1, FrmLogIn.user1, FrmLogIn.pass1); KN.Layconn(); KN.thucthi(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = sql; cmd.Connection = KN.Layconn(); cmd.ExecuteNonQuery(); MessageBox.Show("Sua cong"); load(); } } 9.4.3 Xóa liệu private void bntxoa_Click(object sender, EventArgs e) { string sqldelete = "delete from NHACUNGCAP where macongty = '" + txtmaCT.Text + "'"; ketnoi KN = new ketnoi(FrmLogIn.server1, FrmLogIn.data1, FrmLogIn.user1, FrmLogIn.pass1); KN.Layconn(); KN.thucthi(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = sqldelete; cmd.Connection = KN.Layconn(); cmd.ExecuteNonQuery(); MessageBox.Show("Xoa cong"); load(); } 106 BÀI 10: LẬP BÁO CÁO VỚI CRYSTAL REPORT 10.1 Thiết kế Crystal Report Để làm việc với Crystal Report, ta tạo Project loại Crystal Report Application tự khai báo tham chiếu đến không gian tên dự án loại Windows Forms Tạo kết nối Để kết nối phải tạo đối tượng DataSet vào Project cách chọn Data\Add New Data Source Chọn biểu tượng Database nhấn nút Next, yêu cầu chọn kết nối sở liệu, trước chưa tạo chọn New Connection 107 Chọn Continue, cửa sổ khai báo tên Server sở liệu quyền đăng nhập sở liệu xuất 108 Nhấn OK xuất cấu trúc chuỗi kết nối sở liệu: Chọn nút Next, chọn loại đối tượng sở liệu: Tables, Views 109 Chọn Finish để kết thúc kết nối sở liệu, quay trở lại cửa sổ Solution Explorer thấy xuất đối tượng DataSet: Thiết kế đối tượng DataSet Để kích hoạt DataSet Toolbox, ta chọn vào liên kết ToolBox cửa sổ, cơng cụ thiết kế DataSet xuất Chọn TableAdapter kéo thả vào vùng làm việc DataSet xuất cửa sổ kết nối Thiết kế Crystal Report Sau khai báo cấu trúc đối tượng DataSet, chọn thực đơn Project\ Add New Item chọn Crystal Report 110 Nhấn Add cửa số Crystal Report Gallery xuất hiện, chọn Standard, nhấn OK cửa sổ chọn đối tượng DataSet xuất Nhấn OK, cửa sổ chọn đối tượng DataSet xuất hiện: 111 Nhấn Next mẫu báo cáo xuất hiện: 112 Chọn finish để kết thúc công đoạn thiết kế có trợ giúp Crystal Report, cửa sổ cho phép điều chỉnh thiết kế báo cáo xuất hiện: 10.2 Xây dựng triển khai báo cáo Trình bày liệu từ đối tượng DataSet Để trình bày liệu từ đối tượng DataSet, ta khai báo đoạn chương trình kiện Click nút DataSet: private void button1_Click(object sender, EventArgs e) { rptDepartments document = new rptDepartments(); 113 DataSet dataSet = database.FillDataSet("select * from tblDepartments", "tblDepartments", "Select * from tblWorking", "tblWorking", CommandType.Text); document.SetDataSource(dataSet); crystalReportViewer1.ReportSource = document; } Khi thực thi chương trình nhấn vào nút DataSet danh sách phòng ban thơng tin cơng việc nhân viên trình bày điều khiển Crystal Report Trình bày liệu từ đối tượng DataTable private void button2_Click(object sender, EventArgs e) { rptEmployee document = new rptEmployee(); DataTable dataTable= database.FillDataTable("select * from tblEmployees", CommandType.Text); document.SetDataSource(dataTable); crystalReportViewer1.ReportSource = document; } Chú ý Crystal Report thiết kế dựa thủ tục nội gọi phương thức FillDataSet hay FillDataTable có sử dụng đối tượng SqlCommand SqlParameter để truyền giá trị cho tham số 114 MỤC LỤC BÀI 1: XỬ LÝ NGOẠI LỆ 1.1 Phát sinh bắt giữ ngoại lệ 1.2 Những đối tượng ngoại lệ 1.3 Phát sinh lại ngoại lệ BÀI 2: VISUAL STUDIO.NET 2.1 Lập trình với Visual Studio NET .9 2.2 Thêm điều chỉnh điều khiển 11 2.3 Thay đổi kích thước Form: 12 BÀI 3: THỰC ĐƠN 13 3.1 Thực đơn 13 3.2 Các kiện popup chia sẻ 17 3.3 Thực đơn ngữ cảnh 18 BÀI 4: THANH TRẠNG THÁI 21 4.1 Lớp statusbar 21 4.2 Các bảng (panel) trạng thái .21 4.2.1 Thanh trạng thái với phần tử văn bản(ToolstripStatusLabel) .21 4.2.2 Thanh trạng thái với phần tử tiến trình (Progress Bar) 22 BÀI 5: CÁC HỘP THOẠI .25 5.1 Hộp thoại thông điệp 25 5.2 Hộp thoại Modal Modaless 29 BÀI 6: FORM VÀ CÁC ĐỊNH DẠNG FORM 32 6.1 MDI Form 32 6.2 ChildForm 34 6.3 Normal Form 34 6.4 Thuộc tính Form 35 6.5 Sự kiện Form .36 BÀI 7: CÁC ĐỐI TƯỢNG 38 7.1 Sự thừa kế form 38 7.2 Các nhãn (Label), hộp nhận văn (TextBox) nút nhấn(Button) 41 7.2.1 Nhóm điều khiển Label .41 7.2.2 Nhóm điều khiển LinkLabel 42 7.2.3 Điều khiển TextBox 44 7.2.4 Điều khiển Button 47 115 7.3 Sự kiện chuột bàn phím .48 7.4 ListBox, ComboBox, Calender 53 7.4.1 Điều khiển ComboBox 53 Bài tập áp dụng: 58 7.4.2 Điều khiển ListBox 59 7.4.3 Điều khiển MonthCalender 62 7.5 ImageList 66 7.6 Điều khiển CheckBox 66 7.7 Điều khiển RadioButton 68 7.8 Điều khiển ListView,treeview 70 7.8.1 Điều khiển ListView 70 7.8.2 Điều khiển Treeview 75 8.1 Registry tập tin ini 77 8.2 Kéo thả 78 BÀI 9: TRUY CẬP VÀ XỬ LÝ CƠ SỞ DỮ LIỆU 81 9.1 Tổng quan ADO.NET 81 9.2 Các công cụ kết nối liệu 82 9.2.1 Đối tượng SqlConnection 82 9.2.3 Đối tượng SqlCommand 86 9.2.3 Đối tượng SqlDataAdapter 88 9.3 Hiển thị liệu, lọc liệu 89 9.3.1 Điền liệu vào đối tượng DataSet 89 9.3.2 Điền liệu vào đối tượng DataTable .91 9.3.3 Đối tượng DataSet .92 9.3.4 Đối tượng DataTable 96 9.3.5 Đối tượng DataGridView 101 9.3.6 Đối tượng BindingSource 102 9.4 Thao tác với liệu 103 9.4.1 Thêm liệu 104 9.4.2 Update liệu 105 9.4.3 Xóa liệu 106 10.1 Thiết kế Crystal Report 107 Thiết kế Crystal Report 110 10.2 Xây dựng triển khai báo cáo 113 116