Chuyển đến nội dung chính

Passing Data in C#

A. GIỚI THIỆU

Trong ứng dụng Windows Desktop viết trên nền .NET, một số trường hợp ta cần trao đổi dữ liệu từ form này qua form khác.
Thường thì trao đổi qua hệ quản trị cơ sở dữ liệu như SQL, DB2, LINQ,.. nhưng với những ứng dụng không dùng hệ quản trị CSDL thì chúng ta sẽ sử dụng một số cách sau:
+ Constructor
+ Properties
+ Objects
Delegates

Trong 4 phương pháp này, phương pháp sử dụng hàm dựng (Constructor) được đánh giá là kém nhất, vì đối tượng chỉ được khởi tạo một lần, nếu đối tượng không được hủy (form2 không hủy hoặc tắt đi) mà ta lại muốn thay đổi dữ liệu chuyển từ form1 sang form2 thì phương pháp này không thực hiện được. Delegate là phương pháp khắc phục rất tốt nhược điểm này. Nó được đánh giá cao nhất vì nó không phụ thuộc vào quá trình khởi tạo đối tượng, sự tồn tại của đối tượng. Nó chỉ đơn giản sử dụng các sự kiện do lập trình viên cài sẵn.

B. CÁC THỰC HIỆN

Để thực hiện các phương pháp trên:
Bước 1: Tạo một project có 2 form tên là Form1 và Form2


Bước 2: Với Form 1: Thêm 1 textbox và một button, sử dụng để gửi dữ liệu
Bước 3: Với Form 2: Thêm 1 Label để hiển thị dữ liệu nhận được từ Form1

Và kết quả sau khi thực hiện sẽ như hình sau:

1. Sử dụng Constructor.
Đây là phương pháp đơn giản nhất trong 4 phương pháp. Phương pháp này sử dụng hàm dựng. Hàm dựng là hàm có đặc thù là nó được gọi đầu tiên khi ta tiến hành khởi tạo đối tượng và chỉ gọi một lần(Từ khi khởi tạo đến khi hủy đối tượng). Với phương pháp này ta chỉ cần thêm một tham biến vào hàm dựng của form2.
Code thêm tham biến vào hàm dựng của Form2:
       public Form2(string sendTextBox)
        {
            InitializeComponent();
            label1.Text = sendTextBox;
            //Gán dữ liệu nhận được vào Label
        }
Tại button "Gửi dữ liệu sang form 2" ta tiến hành khởi tạo Form2 và Form2 sẽ hiện ra mỗi khi ta click vào nút này.

      private void button1_Click(object sender, System.EventArgs e)
        {
            Form2 frm = new Form2(textBox1.Text);
            frm.Show();
        }

2. Sử dụng Properties
Properties cho phép clients truy cập trực tiếp đến các thành viên của class. Form cũng là một class, trong phương pháp này ta add thêm thuộc tính (Properties) cho mỗi form. Trong Form2, ta sẽ khai báo một thuộc tính để lưu giữ thông điệp nhận từ Form1. Khi gọi Form2, Form1 sẽ gán thông điệp trực tiếp vào thuộc tính này.
- Ở Form1 ta add thêm một thuộc tính, để nhận lại giá trị từ ô textbox
    public string _textBox1 { get { return textBox1.Text; } }
- Ở Form2 ta add thêm một thuộc tính, để gán giá trị cho Label
    public string _textBox { set { label1.Text = value; } }
- Ở Form1, trong sự kiện button click ta tiến hành khởi tạo và hiển thị Form2. Giá trị của ô textbox trong Form1 sẽ được chuyển sang cho Form2 thông qua thuộc tính, và gán vào Label của Form2.
    private void button1_Click(object sender, System.EventArgs e)
    {
        Form2 frm = new Form2();
        frm._textBox = _textBox1;//gán giá trị của thuộc tính _textbox1 của Form1                                                 cho thuộc tính _textbox của Form2
        frm.Show(); // Hiển thị Form2
    }
3. Sử dụng Objects
Object là kiểu reference và được tạo trên heap và sử dụng từ khóa new. Phương pháp này cũng khá đơn giản.
- Tại Form1 ta tiến hành thay đổi access modifier cho textbox từ private thành public.
    public class Form1 : System.Windows.Forms.Form {
        public System.Windows.Forms.TextBox textBox1;
Tại Form2 ta tiến hành khai báo một biến frm1 có kiểu Form1
    public class Form2 : System.Windows.Forms.Form1 {
        private System.Windows.Forms.Label label1;
        public Form1 frm1;
- Tại Form1 ta tiến hành code hàm sự kiện Clicked của nút button "Gửi dữ liệu sang form 2"
    private void btnSend_Click(object sender, System.EventArgs e)
    {
        Form2 frm = new Form2();
        frm.frm1 = this; //Gán form1 cho biến frm1 có kiểu Form1 của Form2
        frm.Show();     //Hiện Form2
    }
- Trong hàm Load của Form2 ta tiến hành gán giá trị của ô textbox1 của form1 cho Label của form2
      private void Form2_Load(object sender, System.EventArgs e)
      {
          label1.Text = ((Form1)frm1).textBox1.Text;
      }
4. Sử dụng Delegates
- Delegates là một kiểu tham chiếu (reference type), được sử dụng như là một phương thức đặc biệt(Con trỏ hàm), chúng ta có thể đăng ký bất kỳ phương thức nào với delegates. Và đây là một kỹ thuật rất được sử dụng trong lập trình sự kiện.
Ở Form1 ta tiến hành add một delegates như sau
public delegate void delPassData(TextBox text);
- Trong Form2 ta tiến hành tạo một phương thức để delegate sẽ trỏ tới. Trong phương thức này ta tiến hành gán giá trị của ô textbox trong Form1 vào Label của Form2:
    public void funData(TextBox txtForm1) { label1.Text = txtForm1.Text; }
- Trong sự kiện button click của form1 ta tiến hành khởi tạo Form2 và delegate. Chỉ ra một phương thức của Form2 và tiến hành gọi delegate như sau:
    private void btnSend_Click(object sender, System.EventArgs e)
    {
        Form2 frm = new Form2();
        delPassData del = new delPassData(frm.funData);
        del(this.textBox1);
        frm.Show();

    }

Còn một số cách khác nữa nếu các bạn muốn hiểu rõ hơn thì tìm hiểu nhé.

Nhận xét

Bài đăng phổ biến từ blog này

Vẽ UML trong Visual Studio 2015

I. Giới thiệu       Hiện nay có rất nhiều công cụ để mô hình hóa trong đó có UML với các công cụ như: PowerDesigner, Visio, Draw.io,... Nhưng các công cụ này đều phải có bản quyền và hơn hết phải cài đặt thêm khá nặng máy. Ít ai biết đến bộ công cụ vẽ UML có sẵn trong Visual Studio. Vì dân IT hầu như ai cũng có sử dụng nó và hiện giờ đã có bản Visual Studio Community miễn phí cho tất cả các lập trình viên. Vậy chúng ta sẽ tìm hiểu cách vẽ UML trong Visual Studio nhé.

SmartGIT

Hướng dẫn cài đặt GIT Nói chung  Team Foundation Server  trong Visual Studio khá tốt và có nhiều tính năng hay. Nhưng lại giới hạn người dùng. Nếu team bạn nhiều hơn 5 người thì có thể xài GIT vậy. Được cái tất cả là Free.