2013-08-02 63 views
9

Tôi nhận được thông báo lỗi Không thể truy cập đối tượng được xử lý. Tên đối tượng: 'ApplicationProperties'. khi tôi tryo mở lại biểu mẫu sau khi đóng. Tôi đã nhận thấy điều này là từ các biểu mẫu thoát, và thoát là "Đang hủy" trong số đó, vì vậy tôi đã đặt mã sau vào tất cả các nút chấp nhận của tôi và nút hủy (bất kỳ nút nào đóng biểu mẫu).Không thể truy cập lỗi đối tượng được xử lý

this.Hide(); 
this.Parent = null; 

Mã này chỉ đang ẩn biểu mẫu. Không đóng biểu mẫu.

Vì vậy, vấn đề của tôi là, khi tôi nhấp vào nút 'x' trên biểu mẫu, sau đó thử mở lại biểu mẫu, tôi vẫn nhận được thông báo lỗi. Tôi đã thử một vài cách khác nhau để sửa đổi funciton thoát của biểu mẫu như:

private void ApplicationProperties_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     //Hiding the window, because closing it makes the window unaccessible. 
     this.Hide(); 
     this.Parent = null; 
    } 

Nhưng điều này đã mang lại cho tôi không may mắn. Tôi đã tự hỏi nếu có ai biết làm thế nào để giải quyết vấn đề này. Đây là mã đang làm việc cho tôi bên trong nút hủy và chấp nhận của tôi. Nó giống nhau cho tất cả các nút của tôi đóng các biểu mẫu.

private void OptionsCancelbtn_Click(object sender, EventArgs e) 
    { 
     //Hiding the window, because closing it makes the window unaccessible. 
     this.Hide(); 
     this.Parent = null; 
    } 

Tôi đã khai báo cá thể ở đầu lớp của tôi trên biểu mẫu1 và có nút bên trong form1 mở biểu mẫu2.

public partial class MainBox : Form 
{ 
    //Making a name for the ApplicationProperties form. It can be opened when called. 
    ApplicationProperties ApplicationPropertiesWindow = new ApplicationProperties(); 
    private void ApplicationPropertiesbtn_Click(object sender, EventArgs e) 
    { 
     //Show the properties window. 
     ApplicationPropertiesWindow.Show(); 
    }//End ApplicationProperties button. 
} 

Sau khi tôi đóng chương trình với các nút 'x' về hình thức thứ hai tôi không thể truy cập form2 một lần nữa vì thông báo lỗi bắn vào ApplicationPropertiesWindow.Show();

Bên trong form2 Tôi có đoạn mã sau:

public partial class ApplicationProperties : Form 
{ 
    //Creates and sets the instance MainBoxWindow. 
    public MainBox MainBoxWindow { get; set; } 
+1

Bạn có thể hiển thị mã không theo cách bạn mô tả ở đầu * của câu hỏi không? Đó là một trong những thực sự cần sửa chữa, chứ không phải là nỗ lực của bạn để hack xung quanh nó. –

+0

@CodyGray Tôi đã cập nhật câu hỏi cho biết nơi xảy ra lỗi. –

+0

Hành vi mong muốn là gì? Bạn đang cố gắng truy cập vào bất kỳ đối tượng ApplicationProperties nào mà bạn đã xử lý, hoặc bạn vô tình vứt bỏ nó trong mã của bạn ở đâu đó. Hoặc khởi tạo một đối tượng ApplicationProperties mới, hoặc tìm nơi bạn đang xử lý nó và loại bỏ mã nếu bạn muốn đối tượng đó vẫn còn trong bộ nhớ. Kiểm tra định nghĩa của lớp học, hoặc thực hiện tìm kiếm trên Dispose –

Trả lời

6

Hãy thử điều này trong trường hợp FormClosing của bạn:

private void ApplicationProperties_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     //Hiding the window, because closing it makes the window unaccessible. 
     this.Hide(); 
     this.Parent = null; 
     e.Cancel = true; //hides the form, cancels closing event 
    } 

gây ra ngay bây giờ nó vẫn đóng hình thức, do đó vẫn gây ra lỗi.

+0

Tôi đã thử, nhưng không may mắn. –

+0

Có điều gì khác đang chạy mà chúng tôi không thấy không? –

+0

Tôi có thể sai, nhưng không đóng biểu mẫu gây ra sự cố? Tôi cần phải giấu nó? Tôi không chắc chắn 100% về nó, nhưng đó là những gì tôi mặc dù đã được happeneing. –

3

remove Đầu tiên this.Parent = null bcose này là không cần thiết khi bạn ẩn Mẫu

Bây giờ khi bạn ẩn Mẫu và nếu bạn vẫn muốn truy cập hình thức cửa hàng Form này trong var tĩnh. Bcous khi đối tượng không còn sử dụng bộ thu gom rác thải bỏ nó và nó sẽ không còn nữa.

+0

Tôi làm cách nào để thực hiện điều đó? –

+0

Tôi đang trả lời câu hỏi này bằng điện thoại di động của mình. Vì vậy, xin vui lòng xem xét nếu tôi không viết hiện tại –

+0

Làm thế nào để lưu trữ các hình thức trong một var tĩnh? –

3

Vấn đề, ít nhất có lẽ là một phần của nó, trông giống như một chút phụ thuộc lẫn nhau của lớp.

Khi bạn khởi tạo một thể hiện ApplicationProperties, bạn đang tạo ra một tham chiếu đến một đối tượng MainBox, nhưng trong định nghĩa của lớp MainBox, bạn đang tạo ra một đối tượng mới ApplicationsProperties, có sự tham khảo một MainBox .... Tôi m thậm chí còn bối rối. Có phải là MainBox biểu mẫu gốc của bạn, biểu mẫu tải khi bạn khởi động ứng dụng không?

Tôi sẽ không ngạc nhiên nếu một số nội dung trong số MainBox bị vô tình bị hủy nếu bạn đặt tham chiếu đến nó trong lớp ApplicationProperites ... sẽ xử lý khi bạn nhấp vào "X". Một lần nữa, đây là một dự đoán có học thức; Tôi không chắc đó có phải là lý do hay không, ngay cả khi mã không phải là sai mỗi lần, có vẻ lạ lùng với tôi.

Nếu bạn muốn cửa sổ ApplicationProperties kéo dài mãi mãi và đơn giản hóa mọi thứ, chỉ cần khởi tạo phiên bản tĩnh vào đầu bất kỳ biểu mẫu nào sẽ duy trì thời lượng của ứng dụng và hiển thị/ẩn nó tương tự như những gì bạn đã cố gắng ban đầu. Nếu bạn muốn có hiệu quả và cơ bản, hãy xây dựng và xử lý ApplicationProperties bất cứ khi nào bạn cần cho phép người dùng sửa đổi nó, nhưng giết phụ thuộc vòng tròn.

4

Sau khi tôi đóng chương trình với các nút 'x' về hình thức thứ hai tôi không thể truy cập form2 một lần nữa vì thông báo lỗi bắn vào ApplicationPropertiesWindow.Show();

Khi một mẫu được đóng (Form.Close) , bản thân biểu mẫu và tất cả các tài nguyên liên quan của nó được giải phóng. Chỉ có hai ngoại lệ đối với xử lý tự động này, như đã nêu trong tài liệu hướng dẫn:

  1. Các hình thức là một phần của một ứng dụng MDI và không nhìn thấy được.
  2. Biểu mẫu được hiển thị dưới dạng hộp thoại phương thức sử dụng ShowDialog (trái ngược với Show). Nó được thiết kế theo cách này để bạn có thể truy cập các thuộc tính của hộp thoại (ví dụ: để truy xuất dữ liệu nhập của người dùng) sau khi người dùng đã đóng nó.

Trong cả hai trường hợp đặc biệt này, bạn có trách nhiệm gọi phương thức Dispose theo cách thủ công của biểu mẫu. Trường hợp thứ hai đến nay là phổ biến nhất (không ai thực sự sử dụng các mô hình MDI nữa), và được xử lý một cách dễ dàng với một tuyên bố using:

using (MyDialogBox dlg = new MyDialogBox()) 
{ 
    DialogResult result = dlg.ShowModal(this); 
    if (result == DialogResult.Yes) 
    { 
     // access members of "dlg", and 
     // do whatever the user asked 
    } 
} // the Dispose method is automatically called here 

Trong trường hợp của bạn, như là điển hình, các cuộc gọi đến phương pháp Close đang đóng và hủy biểu mẫu. Bạn đã biết rằng bạn không thể truy cập một đối tượng được xử lý (vì nó không còn tồn tại!), Vì vậy đó là lý do tại sao bạn nhận được ngoại lệ khi bạn cố gắng hiển thị nó. Để hiển thị dưới dạng một lần nữa sau khi nó đã bị đóng, bạn cần phải tạo một đối tượng mới của lớp hình thức:

MyForm frm = new MyForm(); 
frm.Show(); 
// ... 
frm.Close(); 

Đây thực sự là phương pháp tốt nhất. Một thể hiện mới của biểu mẫu sẽ giống với một thể hiện bạn đang đóng vì nó được tạo ra từ cùng một lớp. Bạn sẽ làm tốt nhất để bắt đầu suy nghĩ về các thuật ngữ hướng đối tượng và tránh các thiết kế dựa trên singleton bất cứ khi nào có thể. Mỗi biểu mẫu hiển thị trên màn hình là đối tượng độc lập, độc lập. Khi đối tượng đó bị đóng và hủy, bạn không thể sử dụng nó nữa. Nếu bạn muốn sử dụng lại nó, bạn cần tạo một đối tượng mới và hiển thị nó.

Phương pháp Hide có nhiều tính năng hack, chỉ hữu ích khi bạn muốn ẩn tạm thời phiên bản hiện tại của biểu mẫu trong khi vẫn giữ lại trạng thái của nó (ví dụ: giá trị của thuộc tính thành viên, trạng thái kiểm soát, v.v.). Điều này chỉ hoạt động với các đối tượng đơn lẻ sẽ không bao giờ bị phá hủy và phải được thiết kế và bảo trì cẩn thận. Nó cũng có nghĩa là đối tượng mẫu này tiêu thụ tài nguyên mọi lúc, cho dù nó đang được sử dụng hay không, điều đó là lãng phí.

Nếu bạn phải làm điều này, bạn sẽ cần phải theo dõi những gì đang gây ra mẫu biểu mẫu của bạn được xử lý. Nếu không nhìn thấy tất cả các mã của bạn, thật khó cho tôi để làm bất cứ điều gì, nhưng đoán tại nơi mà vấn đề có thể được. Nó có thể liên quan đến việc bạn sử dụng các thuộc tính AcceptButton và/hoặc CancelButton.Dù bằng cách nào, giải pháp tốt nhất và sạch nhất là ghi đè phương pháp OnFormClosing và ngăn biểu mẫu của bạn không bao giờ bị đóng. Bạn sẽ giấu nó thay vì:

public class MyForm : Form 
{ 
    protected virtual void OnFormClosing(FormClosingEventArgs e) 
    { 
     // Prevent the form from closing. 
     e.Cancel = true; 

     // Hide it instead. 
     this.Hide(); 
    } 

    // ...other code in your form class 
}  

Ưu điểm của việc này là bạn chỉ cần phải có mã trong một nơi, địa phương để các lớp có trách nhiệm, chứ không phải tiếp xúc với mã bên ngoài và nằm rải rác khắp ứng dụng của bạn . Và tất nhiên, nó cũng ngăn cản các hình thức từ bao giờ bị đóng bởi mã khung bên ngoài kiểm soát của bạn.

Tôi không biết tại sao bạn đang đặt thuộc tính Parent thành null. Cửa sổ cấp cao nhất (đó là tất cả các biểu mẫu) không bao giờ có cha mẹ. Chỉ các cửa sổ con (ví dụ: điều khiển) có cha mẹ. Nó có thể có một chủ sở hữu, nhưng nó sẽ không nhất thiết. Nó phụ thuộc vào việc bạn vượt qua một cửa sổ chủ sở hữu như một đối số khi gọi phương thức Show.

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