Thành viên
 
 
 
C# - Sử Dụng Delegate Để Truyền Giá Trị Giữa Các Form
  Trung bình: 3.1 (Đã có 36 lượt đánh giá)
   06/09/2007 08:28 AM

Để có thể viết được một ứng dụng phần mềm, bạn phải biết cách truyền giá trị qua lại giữa các Form. Tuy nhiên, khi ta muốn lấy giá trị từ nhiều Form khác, chắc chúng ta sẽ gặp rắc rối với những cách làm thông thường. Delegate sẽ giúp chúng ta giải quyết vấn đề. 

Trước hết, tôi sẽ trình bày cho các bạn các truyền giá trị theo cách thông thường.

Dưới đây là giao diện của các Form:

Đây là giao diện của Form chính. có 2 textbox để hiển thị giá trị lấy từ các Form khác. 2 button có chức năng hiển thị các form mà mình muốn lấy giá trị.

Zensoft Website - Form Delegate

Còn đây là giao diện của Form 1, Gồm 1 textbox để nhập giá trị, nút button để xác nhận giá trị đó và truyền giá trị được nhập trong ô textbox cho form chính.

Zensoft Website - Using Delegate to Pass data between Forms.

Tương tự như Form 1, Form 2 cũng gồm 1 textbox để nhập giá trị, nút button để xác nhận giá trị đó và truyền giá trị được nhập trong ô textbox cho form chính.

Zensoft Website - Truyền Giá Trị giữa các Form

1. Với việc truyền giá trị thông thường:

        - Trong Form Chính:

// Ta khai báo  trường để lưu giá trị.

private string _getFirstValue = null; 

// Thuộc tính này có nhiệm vụ lấy giá trị từ các Form khác.
public string GetFirstValue 
{
      get
      {
             return _getFirstValue;
      }

      set
      {
             _getFirstValue = value;
      }
}
 

Và viết sự kiện cho nút btnGetValue1:

private void btnGetValue1_Click(object sender, EventArgs e)

        frmFirstValue first = new frmFirstValue(); 
        first.ShowDialog();
}

Và khi Form chính được hiển thị, ta phải hiển thị nhận được thông qua các thuộc tính GetFirstValue.         

private void frmMain_Load(object sender, EventArgs e)
{
        txtFirstValue.Text = GetFirstValue;
        txtSecondValue.Text = GetSecondValue;
}

         - Đối với Form 1: Ta chỉ cần viết sự kiện cho Nút btnSend:

private void btnSend_Click(object sender, EventArgs e)
{
         frmMain main = new frmMain();
         main.GetFirstValue = txtValue.Text;   // Truyền giá trị cho Form chính thông qua thuộc tính GetFirstValue.
         main.ShowDialog(); 
         this.Hide();

}

việc khai báo và xử lý sự kiện đối với Form 2 tương tự. Nhưng trong trường hợp này, khi lấy giá trị từ 2 Form khác nhau, cách truyền giá trị thông thường này sẽ không thể làm được. Vậy cách khác, ta sẽ dùng Delegate để giải quyết vấn đề:

2. Sử Dụng Delegate:

          - Dùng Delegate sẽ giúp chúng ta quyết định xem hàm nào sẽ được trong lúc chạy. Về mặt kỹ thuật, Delegate là một dạng tham chiếu được sử dụng để đóng gói 1 hàm với giá trị xác thực và kiểu giá trị trả về.

          - Trong Form 1: Ta khai báo Delegate có tên là PassData có 1 tham số kiểu string và ko có giá trị trả về.

public delegate void PassData(string value);
public PassData passData;

private void btnSend_Click(object sender, EventArgs e)


       if (passData != null)
       {
               passData(txtValue.Text);
       }
       this.Hide();

}

        - Còn trong Form chính: Ta viết Hàm GetFirstValue phải giống như khi khai báo Delegate: có 1 giá trị truyền vào là kiểu chuỗi, và không có giá trị trả về.

public void GetFirstValue(string value)
{
        txtFirstValue.Text = value;

Ta viết sự kiện cho nút btnGetValue1:

private void btnGetValue1_Click(object sender, EventArgs e)
{

       frmFirstValue first = new frmFirstValue();
       first.passData = new frmFirstValue.PassData(GetFirstValue);
       first.Show();

}

Vấn đề đã được giải quyết rất đơn giản khi ta dùng Delegate.

Bạn có thể tham khảo mã nguồn của chương trình tại đây


Gửi bởi: ngocdv
Lượt xem: 23470

 
Nguyễn Hồng Vân 24/10/07 08:54 PM
Em thấy dễ hiểu hơn đọc sách nhiều. Anh có thể giúp em về phần Crystal Report không?

luan3md 25/10/07 01:11 AM
Làm thế nào để load phim lên trong asp.net bằng C#.Tôi đang lập trình C# asp.net của Visual Studio 2005,tạo bảng datalist và muốn load phim lên.Hình load được nhưng không biết load phim,xin chỉ dùm,cám ơn

ngocdv 25/10/07 08:50 AM
Load phim cũng giống như Load ảnh mà thôi, chỉ khác nhau là Dung lượng thôi. Hy vọng bạn sẽ tìm hiểu thêm về vấn đề này. Mình cũng chưa biết bạn viết phần đó như thế nào nên cũng khó nói.

ngocdv 25/10/07 08:59 AM
@Vân: Mình sẽ dành thời gian để viết một Mẫu về Crystal Report.

sondt 25/10/07 10:07 AM
@Luan3md: Bạn chưa nói rõ câu hỏi. Không rõ bạn gặp rắc rối ở chỗ nào không thể hiện được phim hay không upload được lên server.
- Nếu không upload được lên server thì có thể bạn chưa cấu hình ở file web.config để upload file dung lượng lớn.
<system.web>
<httpRuntime maxRequestLength="4096"/> //đây là giá trị mặc định của asp.net, bạn hay đặt số khác tùy theo yêu cầu của bạn, tính theo Kb
</system.web>

sondt 25/10/07 10:48 AM
Nếu bạn chưa thể hiện đc phim thi có thể dùng đoạn code dưới đây để xem phim bằng windows media
<object classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" id="winMedia" name="winMedia" style="width: 450px; height: 350px">
<param name="URL" value="<%# Url %>"> <%-- đường dẫn phim --%>
<param name="AutoStart" value="-1">
<param name="playCount" value="1">
<param name="VOLUME" value="100">
<param name="ENABLECONTEXTMENU" value="-1">
<param name="rate" value="1">
<param name="balance" value="0">
<param name="currentPosition" value="0">
<param name="defaultFrame" value="">
<param name="currentMarker" value="0">
<param name="invokeURLs" value="-1">
<param name="baseURL" value="">
<param name="mute" value="0">

sondt 25/10/07 10:49 AM
<param name="uiMode" value="full">
<param name="stretchToFit" value="0">
<param name="windowlessVideo" value="0">
<param name="enabled" value="-1">
<param name="fullScreen" value="0">
<param name="SAMIStyle" value="">
<param name="SAMILang" value="">
<param name="SAMIFilename" value="">
<param name="captioningID" value="">
<param name="enableErrorDialogs" value="0">
<embed type="application/x-mplayer2" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" name="winMedia" src="<%# Url %>" autostart="1" showstatusbar="1" enablecontextmenu="1" volume="100" height="260" width="400">
</object>

Loivc 08/05/08 11:13 AM
Bài viết được!
Cảm ơn nhiều!

Tran Ba Kim Ngoc 13/08/08 09:19 AM
Chào các bạn, mình đã có được rất nhiều thông tin bổ ích khi truy cập vào trang web này và đặc biệt là tham khảo được rất nhiều thông tin từ diễn đàn, minh hiện tại đang nghiên cứu C# và nói chung mọi thứ là beginer chính vì vậy mình rất mong sự giúp đỡ của các bạn, nếu các bạn có các ví dụ hoạc các clip dạy về môn C# thì sharing cho mình với, xin cảm ơn các bạn rất nhiều

becoi 13/11/08 02:37 AM
Xin hoi khi toi su dung ket noi CSDL trong C# thi co thong bao nhu sau "The event log file is full" tuc la sao?Rat mang nhan duoc tra loi!Xin cam on!

phucnd 01/01/09 11:16 PM
Khi mình dùng chung với chức năng lưu và đọc dữ liệu từ thanh ghi Register trong Windows thì sinh ra lỗi.
Mình tao một form Main có chức năng hiển thị và đọc thông tin mình đã save ứng dụng vào trong Register. Khi mình muốn thay đổi những giá trị hiển thị trên form Main, mình làm một cái Form Dialog để thay đổi giá trị ở form Main đó. Nhưng nó sinh ra lỗi??

Tran Dung 17/07/09 04:36 PM
hihi các bạn , mình là Dung ^^. mình cũng đang bắt đầu học C# Winform và asp.net , rất mong sự giúp đỡ của các bạn, chân thành cảm ơn.

sondunglovely 17/07/09 06:14 PM
help me !!! em có 1 bài toán thế này :
biến $a = 25;(luu gia tien cua san pham)
trong gio hang co them 3 sp: sp1 ---> gia $b = 30;
                            sp2 ---> gia $c = 40;
                            sp3 ---> gia $d = 50;
bay gio em muon khi chon san pham nao do thi cai gia cua no se lap tuc duoc cong vao $a. em ko biet code bang smarty , ai biet giup em voi ,em chan thanh cam on .

Hanam 04/10/09 07:37 AM
@sondunglovely: 1 la ban dung js, 2 la dung update pannel neu ko muon ca trang load lai.

Quảng cáo Hải Phòng
Quảng cáo Hải Phòng
NHẬN XÉT CỦA BẠN
Trung bình: 3.1   
Kiểu gõ: Off Telex VNI VIQR Tổng hợp (Telex, Vni, Viqr)
Họ Tên:
Hòm thư:
Nội Dung:
Số ký tự còn lại: 3500