30/09/2018, 23:35

Cách truyền dữ liệu giữa 2 form trong C#

  1. Cách thứ nhất dùng delegate
  • Form1 viết:
public delegate void delPassData(TextBox text);

private void btnSend_Click(object sender, System.EventArgs e)
{
    Form2 frm= new Form2();
    delPassData del=new delPassData(frm.funData);
    del(this.textBox1);
    frm.Show();
}
  • Form2 viết:
public void funData(TextBox txtForm1)
{
    label1.Text = txtForm1.Text;
}
  1. Cách thứ 2 truyền trực tiếp
  • Form1 viết:
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
//delPassData del=new delPassData(frm.funData); // remove this line
frm.funData(this.textBox1.text()); // passing data directly to function
frm.Show();
}

Mọi người dùng em sự khác nhau giữa 2 cách này ạ
Và khi nào thì nên dùng delegate

Văn Dương viết 01:44 ngày 01/10/2018

Dùng delegate trong các trường hợp :
Muốn truyền dữ liệu ra bên ngoài để xử lý một cách tức thì nhưng trong nội tại không xác định rõ là thằng nào sẽ xử lý mà vẫn đảm bảo tính bao đóng.
Trong ví dụ trên bạn làm ngược. Lẽ ra delegate được khai báo tại form2 và hàm xử lý nằm trên form1. Trong ví dụ trên không cần thiết phải dùng delegate nên bạn chưa nhận ra sự khác biệt nhiều.

Trần Hoàn viết 01:36 ngày 01/10/2018

truyền dữ liệu trực tiếp mình toàn làm thông qua static class :))

Văn Dương viết 01:47 ngày 01/10/2018

Static class thì đảm bảo truyền được dữ liệu như biến tạm thời nhưng không đáp ứng được nhu cầu xử lý tức thì.

Hoàng Anh viết 01:37 ngày 01/10/2018

Trong ví dụ trên không cần thiết phải dùng delegate nên bạn chưa nhận ra sự khác biệt nhiều.

Bạn có thể cho mình ví dụ để thấy rõ sự khác nhau không

Văn Dương viết 01:37 ngày 01/10/2018

Bây giờ mình có 2 thiết bị đại diện cho 2 đối tượng độc lập hoàn toàn là con điện thoại và cái headphone.
2 cái này có cấu tạo được dấu kín bên trong vỏ -> nó là 2 đối tượng thể hiện tính bao đóng.
Con điện thoại thì phát tín hiệu cho headphone nhưng nó không biết cụ thể là con headphone nào và con headphone cũng không biết được cắm vào con điện thoại nào. Làm sao giờ ??
Thế nên nhà sx điện thoại đã có chuẩn audio 3.5 để truyền tín hiệu nhạc qua-> tương tự ta khai báo 1 kiểu delegate.

public delegate void ChuanAudio3_5(Tinhieunhac tinhieu);

để truyền tín hiệu nhạc ra ngoài thì con điện thoại phải bố trí 1 cổng 3.5-> ta khai báo 1 delegate bên trong con điện thoại.

public class DienThoai{
    public chuanaudio3_5 CongAudio3_5;
}

Bây giờ phần nghe nhạc trên điện thoại sẽ đẩy tín hiệu nhạc ra ngoài-> Ta đẩy dữ lieu qua delegate

public class DienThoai{
    public chuanaudio3_5 CongAudio3_5;

    private void PhatNhac(){
        if(CongAudio3_5!=null) // kiểm tra có headphone cắm vào không đã
           CongAudio3_5(nhac);
        }
}

Xong phần điện thoại. đến phần Headphone.
đương nhiên headphone cũng phải có chức năng lấy được nhạc theo chuẩn 3.5 và phát ra loa.

public class Headphone{
    public void DaucamAudio3_5(Tinhieunhac tinhieu){ // tương tụ chuẩn 3.5 nhé thì mới nhận được tín hiệu
         Loa.PhatNhac(tinhieu); // <-- tinhieu là cái mà điện thoại đã chuyển qua cổng 3.5
    }
}

Headphone muốn lấy tín hiệu thì đương nhiên cũng phải kết nối vào điện thoại qua cổng 3.5. Ta xác lập kết nối ở một chỗ nào đó.

void KetNoi(){
     DienThoai dienthoai = new DienThoai(); // có 1 cái điện thoại
     Headphone headphone =new Headphone(); // có 1 cái headphone
     dienthoai.CongAudio3_5 = headphone.DaucamAudio3_5; // kết nối
     dienthoai.PhatNhac(); // kết nối xong thì phát nhạc thôi.
}

–> Con điện thoại đã ủy quyền cho con Headphone phát tín hiệu nhạc ( dữ lieu) mà con điện thoại đã truyền qua cổng 3.5 (delegate). Tiếng ở headphone được phát tức thời, còn kết cấu 2 thằng cũng được dấu kín và toàn vẹn (bao đóng), 2 thằng cũng không hề biết nhau.

Bài liên quan
0