• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Truyền dữ liệu giữa 2 form sử dụng delegate

Các thủ thuật về hệ thống, thư mục, tập tin và mạng

Điều hành viên: tungcan5diop, QUANITGROBEST

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Truyền dữ liệu giữa 2 form sử dụng delegate

Gửi bàigửi bởi neverland87 » T.Ba 22/07/2008 8:23 pm

Thủ thuật: Truyền dữ liệu giữa 2 form sử dụng delegate
Tác giả: neverland87
Mô tả: Dễ


Lên mạng, có nhiều bạn hỏi cách truyền dữ liệu giữa 2 hay nhiều form với nhau. Có rất nhiều cách, cách thông dụng nhất là dùng Properties hay chỉnh sửa modifier cho đối tượng. Trong bài này, mình sẽ hướng dẫn các bạn cách truyền dữ liệu giữa 2 form sử dụng delegate.

- Tạo ứng dụng Win Form.
- Mặc định sẽ là Form1, bạn thêm 1 textbox và 1 button.
- Tạo thêm form nữa, tên mặc định sẽ là form2. Trong form2, bạn thêm 1 textbox
Mục đích của chúng ta là: nhập 1 đoạn text bất kỳ trong textbox1 của form1, nhấn button thì sẽ mở ra form2, và textbox1 của form2 sẽ chứa nội dung vừa nhập trong textbox1 của form1.
- Bây giờ, trong vùng soạn thảo code của Form2 (Form2.cs), trong thân class Form2, bạn tạo 1 delegate:

Mã: Chọn hết

  1. public delegate string MyDelegate();

Đoạn code này bảo cho compiler biết tạo 1 delegate mà nhận lấy địa chỉ của các phương thức mà có dấu ấn: không nhận đối số gì cả và phải trả về 1 trị kiểu string.
Tiếp nối hành động trên, ta tạo 1 đối tượng kiểu MyDelegate vừa tạo ở trên:

Mã: Chọn hết

  1. public MyDelegate GetStringFromAnotherForm;


Ok cả chứ! Bây giờ chuyển qua vùng thiêt kế Form1 (Form1 Designer), thụ lý tình huống Click của button1 của form1 như sau:

Mã: Chọn hết

  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             Form2 frm2 = new Form2();
  4.             frm2.GetStringFromAnotherForm += delegate { return textBox1.Text; };
  5.             frm2.Show();
  6.         }

Chú ý ở đoạn code:

Mã: Chọn hết

  1. frm2.GetStringFromAnotherForm += delegate { return textBox1.Text; };

Ta cho đối tượng GetStringFromAnotherForm trỏ về 1 phương thức mang dấu ấn mà đối tượng delegate nó cho phép, để khỏi mất công tao 1 phương thức mang dấu ấn đó trong thân class của Form1, mình dùng đến phương thức nặc danh có cú pháp sau:

<đối tượng>.<đối tượng delegate> += delegate(<các đối số cần thiết) { <thân phương thức> };

Nếu bạn cảm thấy khó hiểu, bạn có thể làm như sau:

- Tạo 1 phương thức tên GetContentTextBox1 trong thân Form1:

Mã: Chọn hết

  1. public string GetContentTextBox1()
  2.         {
  3.             return textBox1.Text;
  4.         }

Sau đó, sửa lại code của phương thức thụ lý tình huống Click của button 1 như sau:

Mã: Chọn hết

  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             Form2 frm2 = new Form2();
  4.             frm2.GetStringFromAnotherForm += new Form2.MyDelegate(this.GetContentTextBox1());
  5.             frm2.Show();
  6.         }


Bây giờ thì chắc hẳn bạn đã hiểu mình vừa làm gì. Ok, gần xong rồi, cuối cùng, chúng ta chỉ cần thụ lý tình huống Load của Form2 như sau là chạy ro ro:

Mã: Chọn hết

  1. private void Form2_Load(object sender, EventArgs e)
  2.         {
  3.             textBox1.Text = GetStringFromAnotherForm();
  4.         }


Phiền bạn thử nghiêm kết quả nhé. Để khỏi gây rối cho bạn bởi đống phát biểu trên, mình post đoạn code đây đủ như sau:

Form1.cs:

Mã: Chọn hết

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication1
  11. {
  12.    
  13.     public partial class Form1 : Form
  14.     {
  15.        
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.  
  21.         private void button1_Click(object sender, EventArgs e)
  22.         {
  23.             Form2 frm2 = new Form2();
  24.             frm2.GetStringFromAnotherForm += new Form2.MyDelegate(this.GetContentTextBox1());
  25.             //frm2.GetStringFromAnotherForm += delegate { return textBox1.Text; };
  26.             frm2.Show();
  27.         }
  28.         public string GetContentTextBox1()
  29.         {
  30.             return textBox1.Text;
  31.         }
  32.     }
  33. }



Form2.cs:

Mã: Chọn hết

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication1
  11. {
  12.     public partial class Form2 : Form
  13.     {
  14.         public delegate string MyDelegate();
  15.         public MyDelegate GetStringFromAnotherForm;
  16.         public Form2()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.  
  21.         private void Form2_Load(object sender, EventArgs e)
  22.         {
  23.             textBox1.Text = GetStringFromAnotherForm();
  24.         }
  25.     }
  26. }



Happy .NET :-*


SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Truyền dữ liệu giữa 2 form sử dụng delegate

Gửi bàigửi bởi tungcan5diop » T.Tư 18/02/2009 11:19 am

nhân bài viết của Neverland87 mình cũng xin viết 1 bài viết cũng về Delegate(nhưng bằng Vb.net,coi C# ko hiểu lắm :)))
mình cũng có 2 form,Form1 gọi Form2,nhập dữ liệu ở Form2 thì dữ liệu Form1 thay đổi
Form 2 có Textbox1,Button1
trong Form 2 code viết như sau

Mã: Chọn hết

  1.  
  2. khai báo Delegate
  3.  Public Delegate Function myDel(ByVal s As String) As String
  4. khai báo một biến kiểu Delegate
  5. Public mD As myDel
  6.  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  7.         mD.Invoke(TextBox1.Text.Trim)
  8.           End Sub
  9.  

trong Form 1:
khai báo biến kiểu Delegate lấy từ Form2

Mã: Chọn hết

  1.  Dim mDel As Form2.myDel
  2.  

Button 1 khi gọi Form 2

Mã: Chọn hết

  1.  
  2.  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.         Dim f As New Form2
  4.          f.mD = AddressOf myF
  5.         f.Show()
  6.     End Sub
  7.  

gọi hàm myF qua địa chỉ của nó

Mã: Chọn hết

  1. Public Function myF(ByVal s As String) As String
  2.         TextBox1.Text = s
  3.         Return ""
  4.     End Function
  5.  

vậy là xong
Sửa lần cuối bởi tungcan5diop vào ngày T.Tư 18/02/2009 12:12 pm với 1 lần sửa.
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Truyền dữ liệu giữa 2 form sử dụng delegate

Gửi bàigửi bởi tungcan5diop » T.Năm 19/02/2009 8:36 am

tiện viết thêm về một bài về truyền dữ liệu nhưng bằng Event luôn nha
về Form vẫn như cũ ko có gì thay đổi
trong Form2 viết code như sau
khai báo một cái Event tên myEvent

Mã: Chọn hết

  1. Public Event mEvent(ByVal e As String)
  2.  

trong Button1

Mã: Chọn hết

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         RaiseEvent mEvent(TextBox1.Text)
  3.     End Sub
  4.  

trong Form1

Mã: Chọn hết

  1.  Dim WithEvents f As New Form2
  2.  

trong Button 1

Mã: Chọn hết

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         f.Show()
  3.     End Sub
  4.  

 viết hàm sau

Mã: Chọn hết

  1. Public Sub myE(ByVal s As String) Handles f.mEvent
  2.         TextBox1.Text = s
  3.     End Sub
  4.  

vậy là xong
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!


Quay về “[.NET] Hệ thống - Tập tin - Thư mục và Mạng”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách