• 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 liên quan đến ứng dụng, biểu mẫu và control

Moderators: tungcan5diop, QUANITGROBEST

neverland87
Guru
Guru
Posts: 490
Joined: Sat 26/05/2007 4:31 pm
Been thanked: 8 times

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

Postby neverland87 » Tue 22/07/2008 8:24 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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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:

Code: Select all

  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

ga_con
Posts: 1
Joined: Thu 19/02/2009 8:31 pm

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

Postby ga_con » Thu 19/02/2009 8:50 pm

Hơi ngoài luồng chút. Nhưng có 1 cách mà theo mình thấy là đơn giản nhất.
Có 2 form: FormA, FormB
Tại FormB bạn khai báo

Code: Select all

  1.  
  2. public FormA frm=Null
  3. public FromA Frm
  4. {
  5. set {Frm=value;}
  6. get {return Frm;}
  7. }
  8.  


Tại FormA khi gọi FormB thì làm như sau

Code: Select all

  1.  
  2. FormB frm=new FormB();
  3. frm.Frm=this;
  4. frm.show();
  5.  

khi đó bạn có thể từ FormB truy xuất mọi dữ liệu Public của FormA vời cùng 1 cách VD như:

Code: Select all

  1.  
  2. frm.TextBox.Text;
  3.  


Hờ. Mới vô. Thấy vui tham gia chơi. Chả biết cái này ai nói chưa. Chứ mình thấy mọi người toàn dùng cách đâu đâu. Làm cho mem mới khó hiểu. Mình mới học từ đầu tháng 2 cứ phải lôi tư duy của Java vào mới tiêu hoá được.

toohuman
Thành viên chính thức
Thành viên chính thức
Posts: 40
Joined: Sun 08/02/2009 1:41 am

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

Postby toohuman » Fri 13/03/2009 8:47 am

Mấy bạn có code của VB.net không cho mình tham khảo với nhé. Cảm ơn

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

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

Postby tungcan5diop » Fri 13/03/2009 8:58 am

toohuman wrote:Mấy bạn có code của VB.net không cho mình tham khảo với nhé. Cảm ơn

bạn chịu khó Search đi nha..cái này trên forum có rồi.. :D
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

cafesuada
Posts: 1
Joined: Mon 29/12/2008 7:05 pm

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

Postby cafesuada » Sun 10/05/2009 8:05 pm

cho mình hỏi có thể làm thế ở 2 user control ko ?
Mình thử làm ko tìm thấy hàm gọi để lấy dữ liệu ở user control ?!?! Có cách nào để truyền dữ liệu giữa 2 user control ko ? thanks

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

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

Postby tungcan5diop » Mon 11/05/2009 10:53 am

cafesuada wrote:cho mình hỏi có thể làm thế ở 2 user control ko ?
Mình thử làm ko tìm thấy hàm gọi để lấy dữ liệu ở user control ?!?! Có cách nào để truyền dữ liệu giữa 2 user control ko ? thanks

bạn cũng có thể dùng Event để truyền dữ liệu giữa 2 usercontrol..còn dùng Event như thế nào thì trong forum có rồi bạn search nha
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

qhhqnavy
Thành viên tích cực
Thành viên tích cực
Posts: 102
Joined: Sat 26/02/2011 10:45 am
Location: Hải Phòng City

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

Postby qhhqnavy » Wed 16/03/2011 7:09 pm

để mình thử xem thế nào.
thanks.

vienvee
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Sat 08/10/2011 12:53 am
Has thanked: 1 time

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

Postby vienvee » Thu 13/10/2011 8:32 pm

nếu giả sử ở form2 mình có cái datagridview chứ ko fai textbox thì phải làm sao?.. thaks

User avatar
haitu
Guru
Guru
Posts: 206
Joined: Sat 10/09/2005 2:50 pm
Has thanked: 1 time
Been thanked: 19 times
Contact:

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

Postby haitu » Fri 14/10/2011 10:48 am

vô form desinger của form có chứa datagridview, chỉnh dòng khai báo private thành public hoặc protected của dòng khai báo datagridview nếu có kế thừa


Return to “[.NET] Ứng dụng - Form và Control”

Who is online

Users browsing this forum: No registered users and 1 guest