hƯỚng d Ẫn th Ực hÀnh tu n 1 lập trình ứng d...

61
Xây dng phn mm hướng đối tượng GVHD: Trn Anh Dũng HƯỚNG DN THC HÀNH TUN 1 Lp trình ng dng WinForm vi C# 1. Viết chương trình tính đạo hàm đơn thc: P(x) = ax n a. To ng dng WinForm: Khi động Microsoft Visual Studio 2005 Tmenu File chn New\Project b. Thiết kế và lp trình:

Upload: others

Post on 23-Jun-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 1

Lập trình ứng dụng WinForm với C#

1. Viết chương trình tính đạo hàm đơn thức: P(x) = axn

a. Tạo ứng dụng WinForm:

Khởi động Microsoft Visual Studio 2005

Từ menu File chọn New\Project

b. Thiết kế và lập trình:

Page 2: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

c. Đăng ký và xử lý sự kiện cho Button “Thoát”

Cửa sổ Properties, cho

phép thay đổi các thuộc

tính của control

Page 3: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Double click

chuột trái vào

sự kiện cần xử

Page 4: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

d. Đăng ký và xử lý cho sự kiện Button tính đạo hàm: private void bTinh_Click(object sender, EventArgs e)

{

if (heso_p.Text.Trim().Equals("") || somu_p.Text.Trim().Equals(""))

{

MessageBox.Show("Chưa nhập dữ liệu đầy đủ.", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return;

}

int a, b;

//Chuyển đổi chuỗi thành số a = Int32.Parse(heso_p.Text.Trim());

b = Int32.Parse(somu_p.Text.Trim());

//Chuyển đổi số thành chuỗi heso_q.Text = Convert.ToString(a * b);

somu_q.Text = Convert.ToString(b - 1);

}

e. Chú ý xử lý các trường hợp ngoại lệ (dữ liệu nhập không hợp lệ)

i. Trong trường hợp này sẽ phát sinh lỗi và dừng chương trình nếu người dùng nhập

giá trị không hợp lệ (cụ thể dữ liệu nhập không phải là số)

ii. Khi đó phương thức Int32.Parse(…) sẽ phát sinh ngoại lệ

Page 5: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

iii. Để xử lý ngoại lệ trong C#, chúng ta dùng khối try { ... }catch(...) private void bTinh_Click(object sender, EventArgs e)

{

if (heso_p.Text.Trim().Equals("") || somu_p.Text.Trim().Equals(""))

{

MessageBox.Show("Chưa nhập dữ liệu đầy đủ.", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return;

}

int a=0, b=0;

try

{

//Chuyển đổi chuỗi thành số a = Int32.Parse(heso_p.Text.Trim());

b = Int32.Parse(somu_p.Text.Trim());

}

catch (Exception ex)

{

MessageBox.Show(ex.Message.ToString(), "Loi dinh dang so",

MessageBoxButtons.OK, MessageBoxIcon.Stop);

}

//Chuyển đổi số thành chuỗi heso_q.Text = Convert.ToString(a * b);

somu_q.Text = Convert.ToString(b - 1);

}

iv. Để ngăn chặn khả năng phát sinh lỗi ???

���� Không cho phép nhập các ký tự không phải là ký tự số vào textbox

���� Giải pháp ???

Page 6: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

���� Xử lý sự kiện nhấp phím (KeyPress) private void heso_p_KeyPress(object sender, KeyPressEventArgs e)

{

if ((e.KeyChar < '0' || e.KeyChar >= '9'))

e.Handled = true;

}

// Chú ý xử lý trường hợp khi nhấn các phím xóa, di chuyển

f. Sinh viên tự phát triển tiếp để hoàn thiện chương trình trên

Page 7: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 2

Lập trình ứng dụng WinForm với C# (tt)

2. Viết chương trình Giải phương trình bậc 2 có dạng: ax2 + bx + c = 0, với a ≠ 0

a. Tạo ứng dụng WinForm:

Khởi động Microsoft Visual Studio 2005 tạo ứng dụng C# tương tự như bài tập 1

(hướng dẫn của tuần 1)

b. Thiết kế và lập trình:

c. Đăng ký và xử lý sự kiện cho Button “Thoát”

d. Tạo lớp TAM_THUC

Page 8: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Cài đặt lớp TAM_THUC: class TAM_THUC

{

private double a; //a<>0

private double b;

private double c;

public double HeSoA

{

get

{

return a;

}

set

{

a=value;

}

}

public double HeSoB

{

get

{

return b;

}

set

{

b=value;

}

}

public double HeSoC

Click chuột phải lên

project “BaiTap2” để tạo class mới

Page 9: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

{

get

{

return c;

}

set

{

c=value;

}

}

public TAM_THUC()

{

}

public bool NhapHeSo(string hesoa, string hesob, string hesoc)

{

try

{

if (hesoa.Trim().Length == 0)

{

MessageBox.Show("Chưa nhập hệ số a", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return false;

}

else if (hesob.Trim().Length == 0)

{

MessageBox.Show("Chưa nhập hệ số b", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return false;

}

else if (hesoc.Trim().Length == 0)

{

MessageBox.Show("Chưa nhập hệ số c", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return false;

}

a = Double.Parse(hesoa);

b = Double.Parse(hesob);

c = Double.Parse(hesoc);

return true;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Loi", MessageBoxButtons.OK,

MessageBoxIcon.Stop);

return false;

}

}

public NGHIEM GiaiPT()

{

NGHIEM cNghiem = new NGHIEM();

double delta;

delta=b*b-4*a*c;

if(delta<0)

cNghiem.LoaiN = 0;

else if(delta==0)

{

cNghiem.LoaiN = 1;

cNghiem.x1 = -b/2*a;

}

else

{

cNghiem.LoaiN=2;

Để class này hiểu hàm

MessageBox thì ở đầu class phải : using System.Windows.Forms;

Page 10: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

cNghiem.x1 = -b - Math.Sqrt(delta)/2*a;

cNghiem.x2 = -b + Math.Sqrt(delta)/2*a;

}

return cNghiem;

}

}

e. Tạo và cài đặt lớp NGHIEM class NGHIEM

{

private double[] x = new double[2];

private int LoaiNghiem;

public NGHIEM()

{

}

public int LoaiN

{

get

{

return LoaiNghiem ;

}

set

{

LoaiNghiem=value;

}

}

public double x1

{

get

{

return x[0];

}

set

{

x[0]=value;

}

}

public double x2

{

get

{

return x[1];

}

set

{

x[1]=value;

}

}

public void Xuat(TextBox txtNghiem)

{

if(LoaiNghiem==0)

txtNghiem.Text="Phương trình trên vô nghiệm"; else if(LoaiNghiem==1)

{

txtNghiem.Text = "Phương trình trên có nghiệm kép "; txtNghiem.Text += "x= " + x[0];

}

else

{

txtNghiem.Text="Phương trình trên có 2 nghiệm phân biệt:"; txtNghiem.Text +=" x1 = " + x[0];

txtNghiem.Text +=" va x2 = " + x[1];

Phải có: using System.Windows.Forms;

Page 11: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

}

}

}

f. Đăng ký và xử lý cho sự kiện Button giải phương trình: private void bGiai_Click(object sender, EventArgs e)

{

TAM_THUC tt = new TAM_THUC();

NGHIEM N;

tt.NhapHeSo(heso_a.Text.Trim(), heso_b.Text.Trim(),

heso_c.Text.Trim());

N = tt.GiaiPT();

N.Xuat(txtNghiem);

}

g. Xử lý lỗi phát sinh khi người dùng nhập dữ liệu không phải là số

h. Để ngăn chặn khả năng phát sinh lỗi ???

���� Không cho phép nhập các ký tự không phải là ký tự số vào textbox

���� Giải pháp ???

���� Xử lý sự kiện nhấp phím (KeyPress)

i. Sinh viên tự phát triển tiếp để hoàn thiện chương trình trên

Page 12: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 3

Chủ đề: ADO.NET

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.

1. Thiết kế CSDL:

a. Mở ứng dụng Microsoft Access

b. Thiết kế CSDL, đặt tên 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. Thiết kế giao diện:

Tạo project C# Window Application mới với tên project là QLHS

Thiết kế Form “Nhập thông tin học sinh” như màn hình sau:

Page 13: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Tạo kết nối cơ sở dữ liệu bằng dòng lệnh - Để thao tác trên cơ sở dữ liệu sử dụng ADO.NET ta cần có các đối tượng sau:

o Connection để kết nối với cơ sở dữ liệu.gồm OleDbConnection và

SqlConnection.

o Command để thực thi các câu lệnh truy vấn, thực thi các store procedure... bao

gồm OleDbCommand và SqlCommand

o DataAdapter thực hiện ánh xạ dữ liệu vào DataSet thông qua connection đã có

bao gồm OleDbDataAdapter và SqlDataAdapter.

o DataSet chứa dữ liệu thu được hoặc xử lý lấy từ cơ sở dữ liệu. DataSet là tập

hợp gồm các thành phần DataTable (tương ứng với từng View trong cơ sở dữ

liệu), DataColumn (tương ứng với Field trong CSDL) và DataRow (tương ứng

với record trong CSDL).

- Để kết nối với CSDL Access, ta sử dụng OleDb. Ta khai báo sử dụng namespace như sau: using System.Data;

using System.Data.OleDb;

- Ta khai báo các biến cần sử dụng để xử lý CSDL. private OleDbConnection connection;

private OleDbDataAdapter adapter;

private DataSet dataSet;

private OleDbCommand command;

Hàm connect cơ sở dữ liệu - Ta viết hàm connect có nhiệm vụ kết nối cơ sở dữ liệu như sau:

private void connect(string file)

{

Page 14: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

string connnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=" + file;

connection = new OleDbConnection(connnectionString);

}

- Trong sự kiện form load, ta gọi hàm connect để khởi tạo connection

private void Form1_Load(object sender, EventArgs e)

{

connect("E:/DH_HUFLIT/XDPMHDT/DeCuong_HuongDan_ThucHanh/HocSinh.mdb");

}

Hàm lấy danh sách lớp để kết với combobox private DataTable getDSLop()

{

adapter = new OleDbDataAdapter("select * from LOP", connection);

dataSet = new DataSet();

adapter.Fill(dataSet);

return dataSet.Tables[0];

}

- Trong sự kiện formLoad, ta gọi hàm lấy danh sách lớp và kết vào combobox

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";

}

Lấy thông tin từ form vào các biến - Khai báo các biến sau:

private string maHS, tenHS, diachi, malop;

private double dtb;

private DateTime ngaysinh;

- Hàm lấy thông tin: private void getData()

{

maHS = txtMaHS.Text;

tenHS = txtTenHS.Text;

ngaysinh = dtpNgaySinh.Value;

diachi = txtDiaChi.Text;

malop = (string)cmbLop.SelectedValue;

dtb = Double.Parse(txtDiemTB.Text);

}

Hàm thêm dữ liệu vào CSDL private void insert()

{

connection.Open();

string insertCommand = "INSERT INTO HOCSINH VALUES('" +

maHS + "', '" +

Page 15: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

tenHS + "', '" +

ngaysinh.ToShortDateString() + "', '" +

diachi + "', " +

dtb + ", '" +

malop + "')";

command = new OleDbCommand(insertCommand, connection);

command.ExecuteNonQuery();

connection.Close();

}

- Trong sự kiện Click của btnLuu ta thực hiện lưu thông tin vào CSDL private void btnLuu_Click(object sender, EventArgs e)

{

getData();

insert();

MessageBox.Show("Cap nhat thanh cong", "Thong bao",

MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Hàm xóa dữ liệu khỏi CSDL - Tương tự ta có hàm xóa dữ liệu private void delete()

{

connection.Open();

string deleteCommand = "DELETE FROM HOCSINH WHERE MaHS = '"+maHS+"'";

command = new OleDbCommand(deleteCommand, connection);

command.ExecuteNonQuery();

connection.Close();

}

- Trong sự kiện Click của btnXoa ta thực hiện xóa thông tin từ CSDL private void btnXoa_Click(object sender, EventArgs e)

{

getData();

delete();

MessageBox.Show("Xoa du lieu thanh cong", "Thong bao",

MessageBoxButtons.OK, MessageBoxIcon.Information);

}

3. Bài tập:

a. Kiểm tra dữ liệu nhập hợp lệ:

i. Mã học sinh và tên học sinh phải khác null

ii. Điểm trung bình phải nhập giá trị số

iii. …

b. Thực hiện chức năng khi người dùng nhập mã HS đã có, chương trình sẽ hiển thị

thông tin HS cho phép người nhập sửa đổi và lưu lại thông tin HS đã được sửa.

c. Để ngăn chặn khả năng phát sinh lỗi ???

���� Không cho phép nhập các ký tự không phải là ký tự số vào textbox “Điểm trung

bình”

Page 16: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

���� Giải pháp ???

���� Xử lý sự kiện nhấp phím (KeyPress) cho textbox “Điểm trung bình”

d. Khi nhập dữ liệu cho một control xong, người dùng muốn chuyển qua contol tiếp

theo để nhập liệu thì phải nhấn phím “tab” để chuyển focus sang control kế tiếp.

Tuy nhiên, đối với nhiều người dùng, họ lại quen với thao tác nhấn phím “Enter”

để chuyển qua control tiếp theo

���� Giải pháp???

Hướng dẫn: xử lý sự kiện KeyPress của control tương ứng

Khi người dùng nhấn một phím, kiểm tra xem phím đó có phải là phím “Enter”

không? Nếu là phím “Enter” thì gửi phím “TAB”

private void txtMaHS_KeyPress(object sender, KeyPressEventArgs e)

{

//Nếu nhấn phím enter if (e.KeyChar == 13)

SendKeys.Send("{TAB}");

}

e. Sinh viên tự phát triển tiếp để hoàn thiện chương trình trên

Page 17: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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:

Page 18: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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

Page 19: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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

Page 20: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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)

Page 21: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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:

Page 22: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 ???

Page 23: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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();

}

Page 24: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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. …

Page 25: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 5

Chủ đề: ADO.NET (tt)

Phần 2: 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.

(Kết nối với Database SQL Server)

1. Thiết kế CSDL SQL Server như sau:

a. Tạo databse với tên DBHOCSINH, thiết kế các table sau:

HOCSINH STT Tên trường Kiểu dữ liệu Ghi chú

1 MaHS Nvarchar(20) PrimaryKey

2 TenHS Nvarchar(100)

3 NgaySinh Datetime

4 DiaChi Nvarchar(255)

5 DTB Real

6 MaLop Nvarchar(20) ForeignKey (tham chiếu đến

Lop(MaLop)

LOP STT Tên trường Kiểu dữ liệu Ghi chú

1 MaLop Nvarchar(20) PrimaryKey

2 TenLop Nvarchar(100)

3 SiSo smallint

2. Tạo project mới:

Thiết kế lại Form “Kết nối CSDL SQL Server” như màn hình sau:

Page 26: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Source code lớp frmConnection using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace QLHocSinh

{

public partial class frmConnection : Form

{

//Khai báo biến thành phần public string sServerName = "";

public string sDatabaseName = "";

public string sUser = "";

public string sPass = "";

public frmConnection()

{

InitializeComponent();

}

private void frmConnection_Load(object sender, EventArgs e)

{

txtServerName.Focus();

}

private void cmdExit_Click(object sender, EventArgs e)

{

this.Close();

}

private bool KiemTraDLHopLe()

{

if (txtServerName.Text.Trim().Length == 0)

Page 27: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

{

MessageBox.Show("Chưa nhập tên máy chủ.", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return false;

}

if (txtDBName.Text.Trim().Length == 0)

{

MessageBox.Show("Chưa nhập tên CSDL.", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return false;

}

return true;

}

private void cmdConnect_Click(object sender, EventArgs e)

{

if (!KiemTraDLHopLe())

return;

sServerName = txtServerName.Text.Trim();

sDatabaseName = txtDBName.Text.Trim();

sUser = txtUser.Text.Trim();

sPass = txtPass.Text.Trim();

frmHocSinh frm = new frmHocSinh();

//Kiểm tra kết nối CSDL if (!frm.connect(sServerName, sDatabaseName, sUser, sPass))

{

MessageBox.Show("Kết nối đến máy chủ không thành công.", "Thong bao loi", MessageBoxButtons.OK, MessageBoxIcon.Stop);

return;

}

MessageBox.Show("Kết nối đến máy chủ thành công.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);

frm.Show();

this.Hide();

}

}

}

Page 28: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Thiết kế form nhập thông tin học sinh như sau:

Kết quả màn hình khi chạy:

DataGridView

Page 29: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Để kết nối với CSDL SQL Server dùng namespace: using System.Data.SqlClient;

Source code lớp Màn hình nhập thông tin học sinh: using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Data.SqlClient;

namespace QLHocSinh

{

public partial class frmHocSinh : Form

{

private SqlConnection connection;

private SqlDataAdapter adapter;

private DataSet dataSet;

private SqlCommand command;

private string maHS, tenHS, diachi, malop;

private float dtb;

private DateTime ngaysinh;

public frmHocSinh()

{

InitializeComponent();

}

public bool connect(string sServerName, string sDBName,

string sUser, string sPass)

{

string connnectionString = "server=" + sServerName +

"; database=" +

sDBName + "; user id=" + sUser + "; password=" + sPass;

connection = new SqlConnection(connnectionString);

try

{

connection.Open();

connection.Close();

return true;

}

catch

{

return false;

}

}

private DataTable getDSLop()

{

adapter = new SqlDataAdapter("select * from LOP", connection);

dataSet = new DataSet();

adapter.Fill(dataSet);

return dataSet.Tables[0];

}

private DataTable getDSHocSinh()

{

Page 30: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

adapter = new SqlDataAdapter("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];

}

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;

}

private void Form1_Load(object sender, EventArgs e)

{

//Load dữ liệu vào comboBox Lớp DataTable dtLop = getDSLop();

cboLop.DataSource = dtLop;

//Chọn item đầu tiên trong table cboLop.SelectedIndex = 0;

// Column sẽ được hiển thị cboLop.DisplayMember = dtLop.Columns[1].ColumnName;

// Column sẽ được giữ giá trị cboLop.ValueMember = dtLop.Columns[0].ColumnName;

//Load danh sách học sinh lên lưới dgHocSinh.DataSource = getDSHocSinh();

//Định dạng lưới DinhDangLuoi();

}

private void getData()

{

maHS = txtMaHS.Text;

tenHS = txtTenHS.Text;

ngaysinh = dtNgaySinh.Value;

diachi = txtDiaChi.Text;

malop = (string)cboLop.SelectedValue;

dtb = float.Parse(txtDiemTB.Text);

}

private void insert()

{

connection.Open();

string insertCommand = "INSERT INTO HOCSINH VALUES('" +

maHS + "', '" +

Page 31: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

tenHS + "', '" +

ngaysinh.ToShortDateString() + "', '" +

diachi + "', " +

dtb + ", '" +

malop + "')";

command = new SqlCommand(insertCommand, connection);

command.ExecuteNonQuery();

connection.Close();

}

private void delete()

{

connection.Open();

string deleteCommand = "DELETE FROM HOCSINH WHERE MaHS = '" +

maHS + "'";

command = new SqlCommand(deleteCommand, connection);

command.ExecuteNonQuery();

connection.Close();

}

private void btnXoa_Click(object sender, EventArgs e)

{

getData();

delete();

MessageBox.Show("Xoa du lieu thanh cong", "Thong bao",

MessageBoxButtons.OK, MessageBoxIcon.Information);

//Load lai danh sach hoc sinh len luoi

dgHocSinh.DataSource = getDSHocSinh();

//Xoa du lieu tren cac textbox

txtMaHS.Text = "";

btnNew_Click(sender, e);

}

private void btnThoat_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void btnLuu_Click(object sender, EventArgs e)

{

getData();

insert();

MessageBox.Show("Cap nhat thanh cong", "Thong bao",

MessageBoxButtons.OK, MessageBoxIcon.Information);

//Load lai danh sach hoc sinh len luoi

dgHocSinh.DataSource = getDSHocSinh();

}

private void txtMaHS_KeyPress(object sender, KeyPressEventArgs e)

{

if (e.KeyChar == 13)

SendKeys.Send("{TAB}");

}

private void dgHocSinh_SelectionChanged(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection rows = dgHocSinh.SelectedRows;

Page 32: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

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();

}

}

private void btnNew_Click(object sender, EventArgs e)

{

txtMaHS.Text = "";

txtTenHS.Text = "";

txtDiaChi.Text = "";

txtDiemTB.Text = "";

}

}

}

Page 33: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 6

(Thiết kế và xây dựng phần mềm theo mô hình 2 tầng xử lý)

1. Thiết kế CSDL:

a. Sử dụng lại CSDL của tuần thứ 4 (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. Phân tích, thiết kế chức năng của phần mềm theo mô hình 2 tầng xử lý

Dựa vào hướng dẫn thiết kế theo mô hình hai tầng trên lớp lý thuyết, sinh viên phải

phân tích, thiết kế

- Xác định và mô tả phát thảo các lớp đối tượng

- Lập sơ đồ lớp mức phân tích

- Lập sơ đồ lớp mức thiết kế

- Mô tả chi tiết các lớp đối tượng

- Lập sơ đồ kiến trúc tổng thể của phần mềm

- Lập sơ đồ phối hợp của các biến cố

3. Cài đặt:

a. Tạo project “QLHocSinh”

b. Cài đặt lớp đối tượng XL_HOC_SINH

Lớp đối tượng thực hiện xử lý trên tập hợp các học sinh

Page 34: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Add class XL_HOCSINH vào project như sau:

Cài đặt class XL_HOC_SINH

Click chuột phải

Chọn class

Page 35: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Page 36: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

c. Cài đặt lớp đối tượng XL_LOP

Lớp đối tượng thực hiện xử lý trên tập hợp các lớp học

Update HocSinh Set … Where …

Page 37: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

d. Thiết kế lại Form “Nhập thông tin học sinh” như màn hình sau:

Page 38: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Viết hàm code xử lý cho form “Nhập thông tin học sinh”

- Khái báo biến thành phần: private string maHS, tenHS, diachi, malop;

private float dtb;

private DateTime ngaysinh;

private XL_HOC_SINH Hoc_sinh = new XL_HOC_SINH();

private XL_LOP Lop = new XL_LOP(); - Cài đặt cho sự kiện Form_Load:

- Hàm định dạng lưới:

Hàm định dạng tiêu đề và độ rộng các cột của lưới

Page 39: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

- Cài đặt cho sự kiện lưu học sinh (thêm mới 1 học sinh)

- Hàm lấy thông tin học sinh từ các control trên form

- Cài đặt cho sự kiện xóa thông tin một học sinh

- Cài đặt cho sự kiện khi người dùng chọn một row trên lưới chứa danh

sách học sinh

Page 40: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

- Cài đặt cho sự kiện khi người dùng chọn một lớp học trên combobox lớp

Sinh viên phát triển tiếp để hoàn thiện chương trình

4. Bài tập:

Cài đặt chương trình trên theo mô hình 3 tầng xử lý và đánh giá ưu

khuyết điểm

Page 41: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 7

(Thiết kế và xây dựng phần mềm theo mô hình 3 tầng xử lý)

1. Mục đích:

Lưu trữ dữ liệu

Xử lý thông tin

Giao diện người dùng

2. Thiết kế CSDL:

a. Sử dụng lại CSDL của tuần thứ 6 (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

Page 42: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

3. Phân tích, thiết kế chức năng của phần mềm theo mô hình 3 tầng xử lý

Dựa vào hướng dẫn thiết kế theo mô hình ba tầng trên lớp lý thuyết, sinh

viên phải phân tích, thiết kế

- Xác định và mô tả phát thảo các lớp đối tượng

- Lập sơ đồ lớp mức phân tích

- Lập sơ đồ lớp mức thiết kế

- Mô tả chi tiết các lớp đối tượng

- Lập sơ đồ kiến trúc tổng thể của phần mềm

- Lập sơ đồ phối hợp của các biến cố

4. Cài đặt:

a. Tạo project “QLHocSinh”

b. Mô hình 3 tầng của chương trình:

c. Tạo lớp DataProvider để quản lý việc kết nối và truy vấn cơ sở dữ

liệu:

Việc kết nối cơ sở dữ liệu có thể được thực hiện qua nhiều dạng

Provider khác nhau như SqlClient, OleDb, Odbc… Do đó, để có thể dễ dàng

thay đổi Provider khi hệ quản trị cơ sở dữ liệu thay đổi, ta cần thiết lập một

lớp DataProvider riêng với các hàm tương ứng.

Các bước thực hiện:

- Chọn Project -> Add Class: Đặt tên cho class là DataProvider.

- Ở đây ta kết nối với cơ sở dữ liệu Microsoft Access nên ta sử dụng

OleDb để kết nối. Thêm 2 dòng lệnh sau vào đầu file DataProvider.cs:

Giao diện

Cơ sở dữ liệu

HocSinhCtl

HocSinhData

DataProvider

HocSinhInfo

Page 43: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

using System.Data;

using System.Data.OleDb;

Với mỗi lần kết nối, ta sử dụng cùng một connectionString chung.

Khai báo một biến static và một property để lưu giữ connection string xuyên suốt trong chương trình.

protected static string _connectionString;

public static string ConnectionString

{

get

{

return _connectionString;

}

set

{

_connectionString = value;

}

}

Đồng thời ta cần khai báo các biến để thực hiện thao tác trên cơ sở dữ liệu

bao gồm: protected OleDbConnection connection;

protected OleDbDataAdapter adapter;

protected OleDbCommand command;

Tương tự như bài trước, ta viết hàm kết nối CSDL: public void connect()

{

connection = new OleDbConnection(_connectionString);

}

Và hàm ngắt kết nối CSDL:

public void disconnect()

{

connection.Close();

} Để thực hiện truy vấn dữ liệu với các câu truy vấn dữ liệu có sẵn, ta tạo hàm truy vấn executeQuery để trả ra 1 DataReader

public IDataReader executeQuery(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

return command.ExecuteReader();

}

public void executeNonQuery(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

command.ExecuteNonQuery();

}

Page 44: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

public object executeScalar(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

return command.ExecuteScalar();

} d. Tạo lớp HocSinhData (add class HocSinhData.cs) để thực hiện các

thao tác cập nhật cơ sở dữ liệu với dữ liệu học sinh tương ứng

Lớp HocSinhData sẽ chịu trách nhiệm thực hiện cập nhật CSDL thông qua DataProvider đã có.

Mỗi đối tượng HocSinhData sẽ giữ một Data Provider để thực hiện

truy xuất CSDL using System.Data;

using System.Data.OleDb;

namespace QLHocSinh

{

class DataProvider

{

protected static string _connectionString;

protected OleDbConnection connection;

protected OleDbDataAdapter adapter;

protected OleDbCommand command;

public static string ConnectionString

{

get

{

return _connectionString;

}

set

{

_connectionString = value;

}

}

public void connect()

{

connection = new OleDbConnection(_connectionString);

}

public void disconnect()

{

connection.Close();

}

public IDataReader executeQuery(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

return command.ExecuteReader();

}

public void executeNonQuery(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

command.ExecuteNonQuery();

}

Page 45: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

public object executeScalar(string sqlString)

{

command = new OleDbCommand(sqlString, connection);

return command.ExecuteScalar();

}

}

}

e. Xử lý tính toán:

T�o l�p HocSinhInfo ch�a các thông tin c�a m�t h�c sinh v�i ràng bu�c nghi�p v� tương �ng

Lớp HocSinhInfo chứa các thông tin lưu trữ của một đối tượng học

sinh. Lớp này chỉ gồm các biến và thuộc tính (hoạt động tương tự như một

struct). Đây chính là lớp truyền tải dữ liệu giữa tầng giao diện và tầng xử lý

tính tóan using System;

namespace QLHocSinh

{

class HocSinhInfo

{

private string _maHS;

private string _tenHS;

private string _diachi;

private DateTime _ngaysinh;

private float _dtb;

private string _maLop;

public string MaHS

{

get

{

return _maHS;

}

set

{

if (value == null)

throw new Exception("Ma HS khong duoc rong");

_maHS = value;

}

}

public string TenHS

{

get

{

return _tenHS;

}

set

{

if (value == null)

throw new Exception("Ten HS khong duoc rong");

_tenHS = value;

}

Page 46: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

}

public string Diachi

{

get

{

return _diachi;

}

set

{

_diachi = value;

}

}

public DateTime Ngaysinh

{

get

{

return _ngaysinh;

}

set

{

_ngaysinh = value;

}

}

public float DTB

{

get

{

return _dtb;

}

set

{

if (value < 0 || value >10)

throw new Exception("DTB phai >=0 va <=10");

_dtb = value;

}

}

public string MaLop

{

get

{

return _maLop;

}

set

{

_maLop = value;

}

}

}

}

Page 47: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

f. Tạo lớp HocSinhCtl để thực hiện các công việc nghiệp vụ:

Trong mỗi đối tượng HocSinhCtl giữ các đối tượng HocSinhInfo và

HocSinhData. Thông qua đối tượng HocSinhInfo truyền nhận dữ liệu với

HocSinhData để thực hiện tương tác với tầng cơ sở dữ liệu. using System;

namespace QLHocSinh

{

class HocSinhCtl

{

private HocSinhInfo info = new HocSinhInfo();

private HocSinhData data = new HocSinhData();

public HocSinhInfo HocSinh

{

get

{

return info;

}

set

{

info = value;

}

}

public void insert()

{

data.insert(info.MaHS, info.TenHS, info.Ngaysinh,

info.Diachi, info.DTB, info.MaLop);

}

public void delete()

{

data.delete(info.MaHS);

}

public void update()

{

data.update(info.MaHS, info.TenHS, info.Ngaysinh,

info.Diachi, info.DTB, info.MaLop);

}

}

}

Page 48: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

g. Thiết kế lại Form “Nhập thông tin học sinh” như màn hình sau:

5. Bài tập:

- Hoàn chỉnh tầng giao diện của ứng dụng. (gợi ý: trong tầng giao diện chỉ sử

dụng các lớp HocSinhCtl, HocSinhInfo)

- Viết cấu trúc lớp LopInfo để binding danh sách lớp vào combobox.

- Viết các lớp để xử lý thêm , xóa, sửa Lop

- …

Page 49: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

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 8

(Hướng dẫn Crystal Report – Tạo báo cáo)

1. Sử dụng lại CSDL đã dùng trong tuần thực hành trước (tuần 7)

2. Tạo project QLHSReport

a. Tạo mới 1 report

Từ project chọn add new item

Sau đó chọn Crystal report

Page 50: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Chọn “Using the Report Wizard” (Tạo report bằng Wizard)

Chọn “OK”, sau đó chọn Create New Connection để tạo kết nối mới đến CSDL

Page 51: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Page 52: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Chọn Finish

Sau đó chọn bảng dữ liệu “HOCSINH” và bảng “LOP”

Chọn CSDL cần kết nối để truy cập dữ liệu

Page 53: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Chọn các field để hiển thị

Page 54: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Chọn group by theo lớp

Trong bước này cho phép chọn field tính tổng (nếu cần)

Page 55: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Chọn Field Filter nếu cần

Chọn style report

Page 56: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

b. Chạy và hiển thị report:

Add một Form mới có tên frmBaocao, trên form tạo một CystalreportViewer

Khi chúng ta kéo thả CystalreportViewer vào form thì sẽ phát sinh đối tượng

CystalreportViewer1 với phạm vi khai báo là private

Page 57: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Để form khác có thể hiểu được đối tượng CrystalreportViewer1 thì phải khai

báo với phạm vi là public

c. Gọi hiển thị Report:

Page 58: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

Xử lý sự kiện khi người dùng chọn in danh sách học sinh

d. Các khái niệm cơ bản của report

Các section của report

Một report bao gồm 5 phần chính:

- Report header: phần thông tin đầu tiên của report. Một báo cáo report thường

sẽ gồm nhiều trang, report header chính là phần xuất hiện chỉ một lần ở trang

đầu tiên của toàn report. Ví dụ như báo cáo có tiêu đề “Báo cáo thu chi tháng 12 năm 2001” thì tiêu đề sẽ được đặt trong phần report header.

- Page header: phần hiển thị thông tin xuất hiện ở đầu mỗi trang của report. Ví

dụ như một báo cáo dạng bảng có nhiều cột như: STT, Tên, Địa chỉ, SĐT… thì

đầu mỗi trang cần lặp lại những tiêu đề cột để người đọc nhận biết dễ dàng ý

nghĩa mỗi cột. Khi đó các tiêu đề cột được đặt vào phần page header.

- Details: phần hiển thị thông tin chi tiết của report. Một report thường bao gồm

nhiều mục với vai trò như nhau tương ứng với các record của database mà report

Page 59: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

sử dụng. Phần details sẽ liệt kê những record đó. Ví dụ báo cáo thu chi thì các

mục thu chi sẽ được liệt kê trong phần details.

- Report footer: phần hiển thị thông tin xuất hiện chỉ một lần ở cuối report. Ví

dụ thông tin như người lập báo cáo là ai, tại đâu, hôm nào sẽ được đặt ở report footer.

- Page footer: phần thông tin xuất hiện cuối mỗi trang. Ví dụ số trang được đặt ở

page footer.

Field Explorer

Khi chọn xong các đối tượng database cho vào report, Crystal sẽ hiện ra cửa sổ

Field Explorer. Nếu không thấy cửa số Field Explorer, ta click vào button "Field

View" trên thanh toolbar (hoặc chọn View \ Other Windows\ Document Outline

trên menu)

Trong cửa sổ sẽ bao gồm rất nhiều nhóm các trường:

- Database fields: tất cả các trường dữ liệu của các đối tượng database. Thông

thường các trường trong mục này sẽ được hiển thị trong phần detail của report.

- Formula fields: các trường tính toán ta định ra. Ví dụ khi làm một report báo

cáo hóa đơn bán hàng, giả sử database chỉ lưu trữ giá và số lượng của mặt hàng

mua trong hóa đơn mà không lưu trữ thành tiền, khi đó ta có thể tạo một

Formula field thành tiền được tính bằng công thức:

Thành tiền = Giá * Số lượng. Khi đó ta có thể tạo report với cột thành

tiền

(mặc dù không được lưu trong database).

Page 60: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

- Parameter fields: các trường tham số cho report. Ví dụ từ VB, ta gọi report và

truyền vào tên người báo cáo thì tên sẽ được hiển thị ở report footer. Để làm

được điều này ta tạo một paramter field trong Crystal và khi gọi report từ VB

hoặc Delphi thì truyền vào. Lưu ý, khi chạy report trong Crystal, những trường

param sẽ được hỏi giá trị, ta cần nhập vào ngay trong Crystal để hiển thị tạm

thời.

- Special fields: các trường đặt biệt có sẵn của Crystal như số trang, trang thứ

mấy, ngày hiện tại… Thông thường những trường này sẽ được hiển thị trong

những phần header, footer.

Các thao tác cơ bản

- Hiển thị các trường dữ liệu lên report: Để hiển thị trường dữ liệu, drag một trường dữ liệu từ Field Explorer xuống

vùng tương ứng của report. Ví dụ : drag một trường từ database field xuống phần

details của report rồi view, sẽ thấy dữ liệu của report được liệt kê ra.

- View nội dung của report Nhấn nút (Refresh – F5) trên toolbar, nội dung report sẽ hiển thị bên tab preview.

Từ đây trở đi, ta có thể chuyển qua lại giữa tab design và tab preview.

- Các format •••• Suppress và Suppress If Duplicated

- Suppress : Hiển thị đối tượng hay không.

- Suppress If Duplicated : Không hiển thị đối tượng khi có sự trùng

lặp

•••• Tips - Muốn điều chỉnh độ dịch chuyển các control trong report cho tinh thì

nhấp phím phải lên vùng chính của report, bỏ option “Snap to grid” đi. - Đối với Formula Field: Khi tính toán thì những field nào có tham gia

vào phép toán thì field đó trước hết phải được Insert vào Report.

- Group Dùng group để gom nhóm report thành từng phần. VD: Xuất các đơn đặt hàng ta

thường có nhu cầu gom nhóm thành từng đơn đặt hàng (bao gồm các chi tiết) như

sau:

•••• Đơn đặt hàng 1

a. Chi tiết 1

b. Chi tiết 2

•••• Đơn đặt hàng 2

a. Chi tiết 1

b. Chi tiết 2

c. Chi tiết 3

1. Chèn thêm group - Chọn nút có hình trên toolbar phía dưới hoặc menu Insert \ Group để insert một

group mới. (group by)

Page 61: HƯỚNG D ẪN TH ỰC HÀNH TU N 1 Lập trình ứng d …dulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/lap...Xây d ựng ph ần m ềm h ướng đối t ượng GVHD: Tr

Xây dựng phần mềm hướng đối tượng GVHD: Trần Anh Dũng

- “Insert group” dialog hiện ra, cần chọn tên trường để group và thứ tự sort.

- Sau khi chọn OK, report sẽ bổ sung một group mới vào gồm có group header và

group footer và có sẵn một textbox hiển thị trường group trên group header.

2. Sửa đổi group - Chọn menu Report \ Change Group Expert để sửa đổi các group như thứ tự lồng

nhau của các group, trường cần group của các group.

3. Delete group - Click phím phải vào Group header hoặc Group footer ở lề trái cùng của cửa sổ

design và chọn Delete group.

- Trang trí •••• Dùng Insert\Line để tạo đường kẻ dọc hoặc ngang Dùng Insert\Picture để chèn hình. VD như logo của công ty

3. Bài tập:

- Trên cở sở những kiến thức được cung cấp trong bài thực hành trên, sinh

viên tìm hiểu thêm về Crystal report để có thể tạo những báo cáo phức tạp