2008-10-27 19 views
5

Tôi hơi mắc kẹt với cái này vì vậy tôi hy vọng ai đó có thể giúp tôi.Windows Forms Modal Dialog trả về một đối tượng chứ không phải DialogResult

Tôi đang làm một ứng dụng Winforms và tôi cần hiển thị một hộp thoại phương thức (form.ShowDialog) trả về một giá trị (nhắc người dùng một số giá trị và kết thúc chúng trong một đối tượng).

Tôi chỉ không thể xem cách thực hiện điều này thay vì đưa ra tham chiếu vào đối tượng hoặc tùy thuộc vào một số dạng Thuộc tính công khai để đọc dữ liệu sau đó.

Tôi muốn có ShowDialog trả về một thứ gì đó khác, nhưng điều đó không hiệu quả. Thare có một số cách "tốt" để làm điều này không?

Tôi chắc chắn vấn đề không phải là mới, nhưng vì hầu như không ai dường như làm Winforms nữa, tôi không thể tìm thấy bất kỳ hướng dẫn nào trên web.

Trả lời

12

Thêm một phương pháp tĩnh để hình của bạn, như thế này:

public class MyDialog : Form 
{ 
    // todo: think of a better method name :) 
    public static MyObject ShowAndReturnObject() 
    { 
     var dlg = new MyDialog(); 
     if (new dlg.ShowDialog() == DialogResult.OK) 
     { 
      var obj = // construct an instance of MyObject from dlg 
      return obj; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

Bây giờ bạn có thể gọi đây là từ chương trình của bạn thusly:

var myObject = MyDialog.ShowAndReturnObject(); 

... và nếu họ hủy bỏ hộp thoại, myObject sẽ là rỗng.

Bây giờ, đã nói tất cả điều đó, tôi tin rằng việc thêm thuộc tính vào lớp của biểu mẫu mà bạn sau đó đọc từ sau khi gọi ShowDialog() là cách tiếp cận tốt hơn.

+0

Dammit :) Đó là gần như chính xác những gì tôi đã có (ngoại trừ tôi gọi là phương pháp ShowDialog của tôi - và tại sao không?). –

+0

Ồ, và nếu bạn thụt lề khối mã, nó sẽ là cú pháp tô màu cho bạn ... –

+0

Hmm - Tôi đã không gọi cho tôi ShowDialog 'coz Tôi đã lo lắng về việc cố gắng để có một phương pháp tĩnh với cùng tên như một phương thức thể hiện, chỉ bị quá tải theo kiểu trả về. Tôi không nghĩ điều đó là có thể. –

0

Hoặc bạn có thể tạo phương thức ShowDialog mới bên trong lớp biểu mẫu của bạn về cơ bản những gì Matt Hamilton làm. Có lẽ ngay cả một phương pháp mở rộng nếu đó là một cái gì đó bạn làm với rất nhiều hình thức trong vấn đề của bạn.

2

Bạn có thể tạo ra một tài sản công cộng bên trong Dialog đại diện cho giá trị trở về:

/* Caller Code */ 
var dlg = new MyDialog(); 
if(dlg.ShowDialog() == DialogResult.OK) 
    MessageBox.Show(dlg.MyResult); 

/* Dialog Code */ 
public string MyResult { get { return textBox1.Text; } } 

private void btnOk_Click(object sender, EventArgs e) 
{ 
    DialogResult = System.Windows.Forms.DialogResult.OK; 
    this.Close(); 
} 
0

Các tài sản công theo hình thức thoại có ý nghĩa. Tuy nhiên, không đóng hộp thoại trong trình xử lý sự kiện nhấn nút Ok. Khi bạn gán thuộc tính DialogResult, hộp thoại sẽ bị ẩn đi. Sau đó, trong các hình thức gọi điện thoại, bạn có thể xác định nếu Ok hoặc Cancel đã được nhấp bằng cách kiểm tra DialogResult. Sau đó, bạn có thể truy cập thuộc tính công cộng nếu nút Ok được nhấp và sau đó vứt bỏ biểu mẫu hộp thoại. Điều này nên được thực hiện bằng cách sử dụng một khối try-catch-finally trong biểu mẫu gọi hoặc thông qua một câu lệnh sử dụng. Bạn phải vứt bỏ hộp thoại phương thức để ngăn chặn rò rỉ bộ nhớ.

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