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 1Mụ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