2011-07-30 29 views
6

Tôi có biểu mẫu Form1 mà từ đó tôi hiển thị Form2 dưới dạng hình thức phương thức. Từ Form2 Tôi thực hiện tất cả các loại chỉnh sửa và xóa các tập hợp giá trị khác nhau sẽ được phản ánh trong Form1 sau khi đóng Form2. Vì vậy, những gì tôi làm là RePopulateControls_in_Form1() sau khi đóng Form2. Vì RePopulateControls_in_Form1() là một quá trình dài, tôi chỉ muốn thực hiện phương thức đó nếu một số sửa đổi (chỉnh sửa, thêm, xóa) xảy ra trong Form2 và không khi nào Form2 vừa được mở và đóng.DialogResult không đóng biểu mẫu?

Vì vậy, đây là những gì tôi cố gắng làm trong Form1:

 Form2 f = new Form2(); 
     if (f.ShowDialog(this) == DialogResult.Something) 
      RePopulateControls_in_Form1() 

Và sau đó trong Form2 tôi làm,

private void bntEdit() 
    { 
     //If Edit? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntAdd() 
    { 
     //If Add? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntDelete() 
    { 
     //If Delete? 
     this.DialogResult = DialogResult.Something; 
    } 

Nhưng vấn đề của tôi là .Something. Nếu nó là bất cứ điều gì khác hơn là .None, Form2 đơn giản bị đóng. Tôi không muốn Form2 đơn giản đóng cửa trừ khi người dùng đóng nó.

Nếu tôi làm điều này:

RePopulateControls_in_Form1() không trúng!

Tóm lại, trong chương trình của tôi làm thế nào tôi có thể yêu cầu trình biên dịch gọi RePopulateControls_in_Form1() chỉ khi các giá trị được sửa đổi trong Form2?

Lưu ý: Khả năng Repopulating chắc chắn là bắt buộc vì các điều khiển được tạo động và phức tạp một chút (thực ra cái được tạo ra trong Form2 là các điều khiển GUI và nhãn của nó vv).

Trả lời

10

Đặt DialogResult trên Biểu mẫu ẩn biểu mẫu và trả về từ ShowDialog. Nếu bạn muốn trì hoãn điều đó cho đến khi người dùng thực hiện một số hành động khác (chẳng hạn như đóng biểu mẫu), bạn nên lưu trữ trạng thái đó làm trường thành viên và đặt DialogResult trong trình xử lý cho Form.Closing.

Ngoài ra, nếu bạn muốn loại bỏ biểu mẫu phương thức trên một lần nhấn nút, bạn có thể sử dụng thuộc tính Button.DialogResult thay vì thực hiện xử lý Button.Click.

0

Tôi sẽ sử dụng sự kiện trong Biểu mẫu 2. Kích hoạt sự kiện đó khi Form2 của bạn đóng. Xử lý sự kiện đó trong Form1 sẽ cho phép bạn thực hiện bất kỳ xử lý nào bạn muốn. Hơn nữa, nếu cần, bạn có thể trả lại một số thông tin từ Form2 đến Form1 trong các tham số cho sự kiện.

Cách khác là thiết lập biến tĩnh toàn cầu - có thể chỉ là một bool. Sau đó Form2 có thể đặt nó thành true hoặc false tùy thuộc vào việc có thay đổi được thực hiện hay không. Form1 có thể đọc điều này khi Form2 trả về và nếu đúng tiến hành xử lý và đặt nó trở lại false.

+0

OK Tôi nhận được phần đầu tiên, nhưng logic thứ hai không phải là một kỹ thuật mã hóa phù hợp! – nawfal

+1

Tại sao nó không? Trong trường hợp trên, tôi sẽ sử dụng một sự kiện. Tuy nhiên nếu có một giá trị được sử dụng trong suốt một ứng dụng có 20 hình thức và mười lần mà nhiều lớp học như thế nào bạn sẽ đảm bảo rằng chỉ có một giá trị được sử dụng. Bạn có muốn chuyển giá trị từ form sang form và class tới class thông qua một tham số constructor hay các thuộc tính .... – ScruffyDuck

+0

Đây là một cái gì đó đơn giản như việc thiết lập một flag để Form1 biết gì đó về Form2.Tại sao một biến toàn cục không phải là luồng an toàn? Tôi hiểu ý nghĩa của một biến toàn cầu chung khi bạn phải sử dụng nó trên 220 lớp như bạn đã đề cập ở trên. Nhưng ở đây, không chỉ chúng ta nên tránh các biến tĩnh, mà ngủ trong suốt vòng đời của ứng dụng, càng nhiều càng tốt, nhưng quan trọng hơn tôi tự hỏi làm thế nào bạn sẽ thấy trước yêu cầu được đề cập trong câu hỏi mở rộng ra được một cái gì đó như lớn để được tuyển dụng trong 220 lớp học từ câu hỏi đơn giản của tôi :) – nawfal

2

Một cách đơn giản có thể không sử dụng DialogResult ở tất cả trừ một thuộc tính chuyên dụng không can thiệp vào hành vi của Biểu mẫu. - Sau đó, bạn sẽ có thể lập trình bất kỳ logic nào bạn muốn.

+0

Cảm ơn. Đó là những gì tôi đã làm. – nawfal

+0

Nhưng tôi cảm thấy @Ryan Russell có một cuộc gọi tuyệt vời ... Hãy để tôi đánh dấu – nawfal

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