Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng HƯỚNG DẪN THỰC HÀNH TUẦN 4 Chủ đề: ADO.NET (tt) Phần 1: Các thao tác kết nối ADO.NET sử dụng cấu trúc dòng lệnh với namespace System.Data (tt). 1. Thiết kế CSDL: a. Sử dụng lại CSDL của tuần trước (QLHOCSINH.mdb) HOCSINH STT Tên trường Kiểu dữ liệu Ghi chú 1 MaHS Text(10) PrimaryKey 2 TenHS Text(255) 3 NgaySinh Date/Time 4 DiaChi Text(255) 5 DTB Number 6 MaLop Text(10) ForeignKey (tham chiếu đến Lop(MaLop) LOP STT Tên trường Kiểu dữ liệu Ghi chú 1 MaLop Text(10) PrimaryKey 2 TenLop Text(255) 3 SiSo Number 2. Sử dựng lại ứng dụng đã được hướng dẫn trong tuần 3: Thiết kế lại Form “Nhập thông tin học sinh” như màn hình sau: Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Kết quả màn hình khi chạy: DataGridView Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Viết hàm để load danh sách học sinh vào DataGridView - Ta viết hàm getDSHocSinh có nhiệm vụ trả về bảng thông tin học sinh như sau: private DataTable getDSHocSinh() { adapter = new OleDbDataAdapter("Select h.MaHS, h.TenHS, h.NgaySinh, h.DiaChi, h.DiemTB, l.TenLop From HOCSINH h, LOP l Where h.MaLop=l.MaLop", connection); dataSet = new DataSet(); adapter.Fill(dataSet); return dataSet.Tables[0]; } - Trong sự kiện form load, ta gọi hàm getDSHocSinh và gán kết quả cho datasource của DataGridView private void Form1_Load(object sender, EventArgs e) { connect("E:/DH_HUFLIT/XDPMHDT/DeCuong_HuongDan_ThucHanh/HocSinh.mdb"); //Load dữ liệu vào comboBox Lớp cboLop.DataSource = getDSLop(); // Column sẽ được hiển thị cboLop.DisplayMember = "TenLop"; // Column sẽ được giữ giá trị cboLop.ValueMember = "MaLop"; //Load danh sách học sinh lên lưới dgHocSinh.DataSource = getDSHocSinh(); //Định dạng lưới DinhDangLuoi(); } Hàm DinhDangLuoi như sau: private void DinhDangLuoi() { dgHocSinh.ReadOnly = true; dgHocSinh.Columns[0].HeaderText = "Mã HS"; dgHocSinh.Columns[0].Width = 70; dgHocSinh.Columns[1].HeaderText = "Tên HS"; dgHocSinh.Columns[1].Width = 150; dgHocSinh.Columns[2].HeaderText = "Ngày sinh"; dgHocSinh.Columns[2].Width = 90; dgHocSinh.Columns[3].HeaderText = "Địa chỉ"; dgHocSinh.Columns[3].Width = 200; dgHocSinh.Columns[4].HeaderText = "Điểm TB"; dgHocSinh.Columns[4].Width = 80; dgHocSinh.Columns[5].HeaderText = "Lớp"; dgHocSinh.Columns[5].Width = 80; } Đã hướng dẫn trong tuần 3 Định dạng lưới hiển thị danh sách h ọc sinh Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Khi người dùng chọn một row (chọn 1 học sinh) trên lưới hiển thị thông tin học sinh vừa chọn lên các control trên form để chỉnh sửa và cập nhật thông tin. Vậy giải pháp xử lý ??? Sinh viên cần phải Tìm hiểu các sự kiện phát sinh trên lưới DataGridView Trong trường hợp này chúng ta xử lý sự kiện SelectionChanged: private void dgHocSinh_SelectionChanged(object sender, EventArgs e) { DataGridViewSelectedRowCollection rows = dgHocSinh.SelectedRows; if (rows.Count > 0) { DataGridViewRow row = rows[0]; txtMaHS.Text = row.Cells["MaHS"].Value.ToString(); txtTenHS.Text = row.Cells["TenHS"].Value.ToString(); if (row.Cells["NgaySinh"].Value.ToString().Length>0) dtNgaySinh.Value = DateTime.Parse(row.Cells["NgaySinh"].Value.ToString()); txtDiaChi.Text = row.Cells["DiaChi"].Value.ToString(); txtDiemTB.Text = row.Cells["DiemTB"].Value.ToString(); cboLop.Text = row.Cells["TenLop"].Value.ToString(); } } Sinh viên phải xử lý Khi tiến hành lưu thông tin của một học sinh vào bảng HOCSINH phải kiểm tra xem có tồn tại học sinh này trong CSDL chưa? - Nếu chưa có thì insert (thêm mới) - Nếu tồn tại thì update (cập nhật, sửa) Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Khó khăn gặp phải của người dùng: phải chép file HOCSINH.mdb vào đúng vị trí đã sử dụng trong chương trình. Nghĩa là đường dẫn kết nối đến CSDL cố định connect("E:/DH_HUFLIT/XDPMHDT/DeCuong_HuongDan_ThucHanh/HocSinh.mdb"); Nếu trên máy tính không tồn tại đường dẫn này sẽ phát sinhh lỗi và dừng chương trình. Giải pháp khắc phục tình trạng này ??? Cho phép người dùng chỉ ra đường dẫn vật lý lưu trữ CSDL (chọn đường dẫn lưu trữ CSDL) Bước 1: Add thêm một form mới (frmSelectPath) vào Project Thiết kế giao diện cho Form mới như sau: Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Form “frmSelectPath” phải được chạy đầu tiên ??? Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Trong class Form1.cs khai báo biến sPathFilename như sau: public static string sPathFilename = ""; Viết code cho sự kiện khi người dùng chọn File : private void btnOK_Click(object sender, EventArgs e) { //Filter file openFileDialog1.Filter = "File (*.mdb)|*.mdb"; //Không cho phép chọn nhiều file openFileDialog1.Multiselect = false; //Set caption cho dialog openFileDialog1.Title = "Chon CSDL"; //Set tên file mặc định openFileDialog1.FileName = "HOCSINH.mdb"; //Hiển thị hộp thoại DialogResult dgResult = openFileDialog1.ShowDialog(); if (dgResult == DialogResult.OK) txtFile.Text = openFileDialog1.FileName; } Viết code cho sự kiện button “Load”: private void btnLoad_Click(object sender, EventArgs e) { Form1.sPathFilename = txtFile.Text; Form1 frm = new Form1(); this.Hide(); frm.ShowDialog(); } Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Như vậy, trong Form1 chúng ta sửa lại như sau: - Trong sự kiện Form1_Load thay dòng lệnh connect("E:/DH_HUFLIT/XDPMHDT/DeCuong_HuongDan_ThucHanh/HocSinh.mdb"); Bằng dòng lệnh sau: connect(sPathFilename); - Trong sự kiện thoát phải dùng lệnh: Application.Exit(); để thoát ứng dụng ( bởi vì this.Close() dùng để đóng 1 form) Sinh viên phát triển tiếp để hoàn thiện chương trình 3. Bài tập: a. Kiểm tra các ràng buộc về dữ liệu b. Tìm hiểu các sự kiện của DataGridView c. Cải tiến màn hình giao diện nhập thông tin học sinh để người dùng thao tác tiện lợi và thật nhanh chóng i. Thiết kế lại giao diện cho phép nhập danh sách học sinh trực tiếp trên lưới (tượng tự như nhập liệu trên file Excel) ii. Tìm hiểu việc add một số control vào các cột trên DataGridView (Ví dụ: cột ngày sinh phải add control “chọn ngày tháng năm”, cột Lớp phải add control “ComboBox” và load dữ liệu vào comboBox cho phép chọn lựa trong khi nhập liệu. iii. … . dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng HƯỚNG DẪN THỰC HÀNH TUẦN 4 Chủ đề: ADO. NET (tt) Phần 1: Các thao tác kết nối ADO. NET sử dụng cấu trúc dòng lệnh với namespace System.Data (tt). . Number 2. Sử dựng lại ứng dụng đã được hướng dẫn trong tuần 3: Thiết kế lại Form “Nhập thông tin học sinh” như màn hình sau: Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng Kết. dgHocSinh.Columns [4] .HeaderText = "Điểm TB"; dgHocSinh.Columns [4] .Width = 80; dgHocSinh.Columns[5].HeaderText = "Lớp"; dgHocSinh.Columns[5].Width = 80; } Đã hướng dẫn trong