1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập thực hành lập trình winform bài 6

7 481 2

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 382,37 KB

Nội dung

Nội dung Trao đổi dữ liệu giữa các form Để có thể truyền nhận dữ liệu giữa form này và form kia thì với kiến thức cơ bản có thể thực hiên thông qua các phương pháp sau đây.. public par

Trang 1

Mục tiêu

 Trao đổi dữ liệu giữa các form

 Xử lý event giữa các form

 Anonymous method cơ bản

Nội dung

Trao đổi dữ liệu giữa các form

Để có thể truyền nhận dữ liệu giữa form này và form kia thì với kiến thức cơ bản có thể thực hiên thông qua các phương pháp sau đây

Trước tiên tạo project winform với 2 form: frmSender và frmReceiver như sau:

frmSender TextBox: txtMSSV

TextBox: txtHoTen

frmReceiver

ListView: lvDsSV

Trang 2

được nhập vào

public partial class frmSender : Form

{

//lưu giữ ds sv là dữ liệu để truyền đi

List<Tuple<string, string>> dsSV = new List<Tuple<string, string>>();

public frmSender()

{

InitializeComponent();

btnAddSV Click += new EventHandler(btnAddSV_Click);

btnDsSV Click += new EventHandler(btnDsSV_Click);

}

void btnAddSV_Click(object sender , EventArgs )

{

string mssv = txtMSSV Text ;

string hoten = txtHoTen Text ;

if (string.IsNullOrEmpty( mssv ) || string.IsNullOrEmpty( hoten ))

{

MessageBox.Show("Dữ liệu không được để trống");

return;

}

dsSV Add(new Tuple<string, string>( mssv , hoten ));

}

void btnDsSV_Click(object sender , EventArgs )

{

OpenFrmReceiver();

}

void OpenFrmReceiver()

{

//code thích hợp theo từng phương pháp

}

}

 PP 1: Sử dụng phương thức khởi tạo có đối số, dữ liệu được truyền thông qua tham số truyền vào phương thức khởi tạo của form nhận Vì vậy phải cài đặt phương thức khởi tạo có đối số là dssv của frmReceiver

public partial class frmReceiver : Form

{

public frmReceiver()

{

InitializeComponent();

}

//phương thức khởi tạo có đối số thích hợp

public frmReceiver(List<Tuple<string, string>> dssv )

{

InitializeComponent();

FillDsSV( dssv );

Trang 3

}

public void FillDsSV(List<Tuple<string,string>> dssv )

{

//xóa item cũ

lvSV Items Clear();

//thêm các item mới

ListViewItem lvi = null;

foreach (var sv in dssv )

{

lvi = new ListViewItem( sv Item1 );

lvi SubItems Add( sv Item2 );

lvSV Items Add( lvi );

}

}

}

Cài đặt lại ở frmSender

void OpenFrmReceiver()

{

//code thích hợp theo từng phương pháp

//phương pháp 1

PP1();

}

void PP1()

{

frmReceiver frm = new frmReceiver( dsSV );

frm Show();

}

Nhược điểm của phương pháp này là chỉ truyền được dữ liệu 1 lần duy nhất ban đầu

 PP 2: Sử dụng đối tượng tham chiếu (reference object), dữ liệu được lấy trực tiếp từ đối tượng tham chiếu của frmSender trong frmReceiver vì thế phải tạo public cho thành phần dữ liệu cần truy suất

- Thay đổi ở frmReceiver

public partial class frmReceiver : Form

{

public frmSender FormSender { get; set; }

public frmReceiver()

{

InitializeComponent();

Load += new EventHandler(frmReceiver_Load);

}

void frmReceiver_Load(object sender , EventArgs )

{

FillDsSV( FormSender DSSV );

}

- Thay đổi ở frmSender

public partial class frmSender : Form

{

Trang 4

{

get { return dsSV ; }

}

//

void OpenFrmReceiver()

{

//code thích hợp theo từng phương pháp

//phương pháp 1

//PP1();

//phương pháp 2

PP2();

}

//

void PP2()

{

frmReceiver frm = new frmReceiver();

frm FormSender = this;

frm Show();

}

}

Nhược điểm của pp này là phải thay đổi khá nhiều thành phần, đặc biệt là truy suất trực tiếp qua tham chiếu đối tượng

 PP 3: sử dụng events, đây là phương pháp nên được sử dụng trong mục đích truyền dữ liệu giữa các form với các ưu điểm là:

o Cài đặt uyển chuyển, độc lập giữa các form

o Việc truyền dữ liệu dễ dàng cập nhật ngay khi thay đổi thông qua event

o Cách cài đặt như sau: tạo event tương ứng với việc thay đổi dữ liệu trên form truyền, còn ở form nào cần tiếp nhận và xử lý thì chỉ cần gắn kết phương thức xử

lý tương ứng

o Cụ thể ở frmSender sẽ tạo event và phát sinh như sau

public partial class frmSender : Form

{

//tạo delegate riêng cho event

public delegate void DataChangedHandler(List<Tuple<string, string>>

dsSV );

//tạo events

public event DataChangedHandler DataChanged;

//

void btnAddSV_Click(object sender , EventArgs )

{

string mssv = txtMSSV Text ;

string hoten = txtHoTen Text ;

if (string.IsNullOrEmpty( mssv ) || string.IsNullOrEmpty( hoten )) {

MessageBox.Show("Dữ liệu không được để trống");

return;

}

dsSV Add(new Tuple<string, string>( mssv , hoten ));

DataChanged( dsSV );

Trang 5

}

void OpenFrmReceiver()

{

//code thích hợp theo từng phương pháp

//phương pháp 1

//PP1();

//phương pháp 2

//PP2();

//phương pháp 3

PP3();

}

//

void PP3()

{

frmReceiver frm = new frmReceiver( dsSV );

DataChanged += new DataChangedHandler( frm FillDsSV);

frm Show();

}

}

Xử lý event giữa các form

Giống như ví dụ trong phương pháp 3 ở trên Xét thêm ví dụ sau

 Tạo project với 2 form: frmRaiseEvent và frmReceiveEvent

 Trong frmRaiseEvent tạo event TextChanged (của form) và raise trong event TextChanged của TextBox

public partial class frmRaiseEvent : Form

{

public delegate void TextUpdatedHandler(string text );

public event TextUpdatedHandler TextUpdated;

public frmRaiseEvent()

{

InitializeComponent();

Load += new EventHandler(frmRaiseEvent_Load);

TextBox: txtInput

Label: lblReceiver

Trang 6

}

void frmRaiseEvent_Load(object sender , EventArgs )

{

//tạo thể hiện frmReceiveEvent

frmReceiveEvent frm = new frmReceiveEvent(this);

frm Show();

}

void txtInput_TextChanged(object sender , EventArgs )

{

//raise event

TextUpdated( txtInput Text);

}

}

 Trong frmReceiveEvent tạo phương thức xử lý event và gắn kết để tiếp nhận

public partial class frmReceiveEvent : Form

{

public frmReceiveEvent()

{

InitializeComponent();

}

public frmReceiveEvent(frmRaiseEvent frm )

{

InitializeComponent();

//truyền tham số đối tượng frmRaiseEvent chỉ

//để gắn kết event

frm TextUpdated += new frmRaiseEvent.TextUpdatedHandler(frm_TextChanged); }

void frm_TextChanged(string text )

{

lblReceiver Text = text ;

}

}

Anonymous method cơ bản

Cần hiểu khái niệm method (phương thức) là một khối các lệnh được đặt tên với mục đích có thể sử dụng lại nhiều lần Ngoài ra có thể ví method cài đặt với tên cụ thể là cài đặt outline

Có những trường hợp yêu cầu khối lệnh nhưng chỉ sử dụng duy nhất 1 lần thì khi đó nhu cầu gắn liền cài đặt method tại vị trí gọi (kiểu cài đặt inline), lúc này tên của method là không cần thiết và bỏ luôn nên gọi là Anonymous Method (phương thức vô danh)

Ví dụ dễ thấy nhất là các phương thức xử lý event thường chỉ sử dụng duy nhất 1 lần nên khi cần ngắn gọn có thể cài đặt kiểu anonymous method như sau

 Tạo project với frmAnonymousMethod giao diện như sau:

Trang 7

 Code cho frmAnonymousMethod như sau:

public partial class frmAnonymousMethod : Form

{

public frmAnonymousMethod()

{

InitializeComponent();

//gắn kết event cần 1 phương thức cụ thể

//sử dụng anonymous method để cài đặt

//trực tiếp (chú ý từ khóa delegate)

txtInput TextChanged += new EventHandler(delegate(object sender , EventArgs

e ){

lblOutput Text = txtInput Text;

});

}

}

 Như vậy cách cài đặt anonymous method cũng rất giống cách cài đặt trong javascript (sử dụng từ khóa function)

Bài tập

Thực hiện hoàn chỉnh các ví dụ ở trên

TextBox: txtInput

Label: lblOutput

Ngày đăng: 22/01/2016, 18:33

TỪ KHÓA LIÊN QUAN

w