2012-12-05 31 views
5

Tôi cần tạo ứng dụng Biểu mẫu Windows có thể gửi dữ liệu và nhận dữ liệu từ một phiên bản Form khác. nghĩa là, Form là nhà xuất bản và người đăng ký, cả hai người trong số họ.Cách sử dụng sự kiện và ủy quyền để gửi dữ liệu giữa các biểu mẫu?

Thật không may, hôm đó tôi bị bệnh và tôi không thể tham gia bài giảng vào ngày hôm đó.

Tôi sẽ giải thích một lần nữa:

tôi có một cuộc trò chuyện nhỏ Form, người có: nút Instance mới, nhận tin nhắn, và gửi tin nhắn.

như bạn có thể nhìn thấy ngay bên dưới:

enter image description here

Khi tôi gửi một tin nhắn, nó sẽ được hiển thị trong mục "Nhận được" hộp của tất cả các trường.

Tôi đoán rằng tôi cần phải sử dụng các đại biểu và sự kiện.

Làm như thế nào? cảm ơn!!

+0

Hãy xem mẫu "người quan sát". http://msdn.microsoft.com/en-us/library/ee817669.aspx –

Trả lời

7

Dưới đây là một giải pháp nhanh chóng .. Hãy cho tôi biết nếu bạn có bất kỳ thắc mắc hoặc nếu bạn tìm thấy những bình luận khó hiểu ..

Đây là lớp Mẫu (mã đằng sau). Lưu ý rằng khi biểu mẫu được khởi tạo, nó "đăng ký" một sự kiện bằng cách "nối" một trình xử lý sự kiện cho sự kiện HandleMessage bên trong lớp Message. Trong lớp Form, đây là nơi bộ sưu tập item của ListView được điền.

Bất cứ khi nào nút mẫu mới được nhấp, Mẫu cùng get của tạo ra và hiển thị (điều này cho phép cho mã tái sử dụng, vì cùng một logic sẽ giống hệt nhau cho tất cả các trường của Form)

public partial class Form1 : Form 
{ 
    Messages _messages = Messages.Instance; // Singleton reference to the Messages class. This contains the shared event 
              // and messages list. 

    /// <summary> 
    /// Initializes a new instance of the <see cref="Form1"/> class. 
    /// </summary> 
public Form1() 
{ 
    InitializeComponent(); 

    // Subscribe to the message event. This will allow the form to be notified whenever there's a new message. 
    // 
    _messages.HandleMessage += new EventHandler(OnHandleMessage); 

    // If there any existing messages that other forms have sent, populate list with them. 
    // 
    foreach (var messages in _messages.CurrentMessages) 
    { 
     listView1.Items.Add(messages); 
    } 
} 

/// <summary> 
/// Handles the Click event of the buttonNewForm control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
private void buttonNewForm_Click(object sender, EventArgs e) 
{ 
    // Create a new form to display.. 
    // 
    var newForm = new Form1(); 
    newForm.Show(); 
} 

/// <summary> 
/// Handles the Click event of the buttonSend control. Adds a new message to the "central" message list. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
private void buttonSend_Click(object sender, EventArgs e) 
{ 
    string message = String.Format("{0} -- {1}", DateTime.UtcNow.ToLongTimeString(), textBox1.Text); 
    textBox1.Clear(); 
    _messages.AddMessage(message); 
} 

/// <summary> 
/// Called when [handle message]. 
/// This is called whenever a new message has been added to the "central" list. 
/// </summary> 
/// <param name="sender">The sender.</param> 
/// <param name="args">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
public void OnHandleMessage(object sender, EventArgs args) 
{ 
    var messageEvent = args as MessageEventArgs; 
    if (messageEvent != null) 
    { 
     string message = messageEvent.Message; 
     listView1.Items.Add(message); 
    } 
} 

}

Đây là lớp Tin nhắn mà tôi đã tạo để xử lý danh sách thư "trung tâm" được gửi giữa các Biểu mẫu. Lớp Messages là một singleton (có nghĩa là, nó có thể được khởi tạo chỉ một lần), cho phép một danh sách được duy trì trong suốt tất cả các trường hợp của một Biểu mẫu. Tất cả biểu mẫu sẽ chia sẻ cùng một danh sách và được thông báo bất cứ khi nào danh sách được cập nhật. Như bạn có thể thấy, sự kiện "HandleMessage" là sự kiện mà mỗi Form sẽ đăng ký bất cứ khi nào nó được tạo/hiển thị.

Nếu bạn nhìn vào chức năng NotifyNewMessage, điều này được gọi bởi lớp Tin nhắn để thông báo cho các thuê bao rằng đã có thay đổi. Vì EventArgs được sử dụng để truyền dữ liệu cho người đăng ký, tôi đã tạo một EventArgs đặc biệt để truyền các tin nhắn mới được thêm vào cho tất cả các thuê bao.

class Messages 
{ 
    private List<string> _messages = new List<string>(); 
    private static readonly Messages _instance = new Messages(); 
    public event EventHandler HandleMessage; 

    /// <summary> 
    /// Prevents a default instance of the <see cref="Messages"/> class from being created. 
    /// </summary> 
    private Messages() 
    { 
    } 

    /// <summary> 
    /// Gets the instance of the class. 
    /// </summary> 
    public static Messages Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    /// <summary> 
    /// Gets the current messages list. 
    /// </summary> 
    public List<string> CurrentMessages 
    { 
     get 
     { 
      return _messages; 
     } 
    } 

    /// <summary> 
    /// Notifies any of the subscribers that a new message has been received. 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void NotifyNewMessage(string message) 
    { 
     EventHandler handler = HandleMessage; 
     if (handler != null) 
     { 
      // This will call the any form that is currently "wired" to the event, notifying them 
      // of the new message. 
      handler(this, new MessageEventArgs(message)); 
     } 
    } 

    /// <summary> 
    /// Adds a new messages to the "central" list 
    /// </summary> 
    /// <param name="message">The message.</param> 
    public void AddMessage(string message) 
    { 
     _messages.Add(message); 
     NotifyNewMessage(message); 
    } 
} 

/// <summary> 
/// Special Event Args used to pass the message data to the subscribers. 
/// </summary> 
class MessageEventArgs : EventArgs 
{ 
    private string _message = string.Empty; 
    public MessageEventArgs(string message) 
    { 
     _message = message; 
    } 

    public String Message 
    { 
     get 
     { 
      return _message; 
     } 
    } 
} 

Ngoài ra .. để các thư được hiển thị chính xác, đừng quên đặt thuộc tính "Chế độ xem" của điều khiển ListView thành "Danh sách". Một cách dễ dàng hơn (và ưa thích) sẽ đơn giản là sử dụng loại danh sách ObservableCollection, đã cung cấp một sự kiện mà bạn có thể đăng ký.

Hy vọng điều này sẽ hữu ích.

+0

Ok, cảm ơn, tôi sẽ thử nó khi tôi sẽ ở nhà (vì tôi đang sử dụng ubuntu trên máy tính xách tay của mình). Bạn có thể vui lòng mô tả tôi ngay sau đó bạn đã viết gì ở đó không? – Billie

+0

@ user1798362 được cập nhật để cung cấp thêm thông tin. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào khác .. –

+0

Nó không sử dụng Đại biểu và Sự kiện, nhưng ý tưởng là rõ ràng. cảm ơn. – Billie

Các vấn đề liên quan