2014-07-18 45 views
8

Tôi đang phát triển một ứng dụng Windows dựa trên mẫu Biểu mẫu Windows. Tôi đang sử dụng phiên bản .NET 3.5. Trong ứng dụng này, mục tiêu là tất cả các cài đặt trực quan của các biểu mẫu khác nhau đều có thể được quản lý từ tệp App.Config (màu nền, màu nền của các nút khác nhau, v.v ...).Lỗi: Dịch vụ System.Windows.Forms.Design.IEventHandlerService đã tồn tại trong vùng chứa dịch vụ

Vì vậy, về cơ bản, tôi có một lớp "FormBase", trong đó tất cả các hình thức của tôi kế thừa, và lớp này chứa mã như thế này:

public class FormBase : Form 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     BackColor = Color.FromName(ConfigurationManager.AppSettings["backColor"]); 

     foreach (var item in this.Controls) 
     { 
      if (item is Button) 
      { 
       ((Button)item).BackColor = Color.FromName(ConfigurationManager.AppSettings["buttonBackground"]); 
       ((Button)item).ForeColor = Color.FromName(ConfigurationManager.AppSettings["buttonText"]); 
      } 
      if (item is ...) 
      { 
       //some other code 
      } 
     } 
    } 
} 

Và sau đó tôi có tập tin App.Config của tôi mà chứa mã như :

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="buttonText" value="White"/> 
    <add key="buttonBackground" value="Red"/> 
    <add key="backColor" value="White"/> 
    <add key="textColor" value="Red"/> 
    </appSettings> 
</configuration> 

Và bây giờ, trong tờ khai của tất cả các hình thức của tôi, tôi có dòng

public partial class Form1 : FormBase 

Vấn đề của tôi là, khi tôi chạy ứng dụng nó chạy tốt, và nó hoạt động, các màu khác nhau trong các tệp App.Config là các màu được hiển thị trên biểu mẫu của tôi. Nhưng khi tôi chỉ nhìn vào nhà thiết kế trong Visual Studio mà không cần chạy ứng dụng, nhà thiết kế không thể hiển thị biểu mẫu sẽ như thế nào và tôi nhận được lỗi sau đây

Dịch vụ System.Windows.Forms.Design. IEventHandlerService đã tồn tại trong vùng chứa dịch vụ. Tên thông số: serviceType

Và tôi không biết cách giải quyết vấn đề này. Đây không phải là một vấn đề lớn kể từ khi ứng dụng chạy tốt anyway, nhưng điều này làm phiền tôi và tôi muốn biết những gì đang xảy ra

Trả lời

6

Tôi chỉ chạy vào vấn đề này bản thân mình. Theo một trang web khác, lỗi này có thể được sửa bằng cách đóng studio trực quan và xóa thư mục obj của bạn, sau đó mở lại studio trực quan và thực hiện xây dựng lại dự án.

Đây là trang tôi đã đọc. http://www.csharp411.com/ieventhandlerservice-already-exists-in-the-service-container/

Họ cũng đã đề nghị xóa thư mục bin nhưng tôi thấy rằng tôi không phải làm điều đó. Hy vọng điều này sẽ hữu ích!

+0

Tôi đã thử nhưng không hoạt động. Tôi đã đóng Visual Studio, các thư mục đã xóa, mở lại và biên dịch lại được mô tả. Tôi cũng đã cố gắng để làm sạch hoàn toàn giải pháp. Không có gì làm. –

+0

Làm việc cho tôi. Tôi cũng chỉ cần xóa thư mục 'obj' chứ không phải thư mục' bin' – BigHeadCreations

0

Tôi cũng đã gặp sự cố này. Tôi đã thử các giải pháp trên, và nó đã không làm việc cho tôi. Cấu trúc Tôi có là thế này: công Form1: Form công Form2: Form1 công Form3: Form2

tôi đã cố gắng xây dựng lại và xóa các obj/thư mục bin nhưng không thể nhận được lỗi này ra đi. Cuối cùng, như là một kiểm tra sanity, tôi đã thay đổi Form3 để kế thừa từ lớp Windows Form:

System.Windows.Forms.Form 

Sau đó, tôi mở lại Form3 trong thiết kế, và nó xuất hiện (như tôi mong đợi). Sau đó tôi đã thay đổi Form3 để thừa kế từ Form2 và mở lại Form3 trong nhà thiết kế. Va no đa hoạt động.

# random-bug-fix-win

Chúc may mắn!

0

Tôi đã làm sạch và xây dựng lại giải pháp của mình để thoát khỏi tình huống này.

Ngoài ra kiểm tra nếu bạn sử dụng lớp mở rộng cho Form và cũng sử dụng KeyEvent hoặc MouseEvent từ Windows.Forms, chắc chắn rằng bạn gọi args này bằng cách Windows.Forms.KeyEventArgs hoặc Windows.Forms.MouseEventArgs.

1

Điều này làm việc cho tôi mặc dù tôi vẫn muốn hiểu rõ hơn những gì đã xảy ra. Tôi đã tạo ra một hình thức kế thừa trong Visual Studio. Dường như nhà thiết kế Visual Studio gọi hàm Load trước khi hiển thị biểu mẫu. Hàm tải trong cửa sổ cha đã được gọi và truy cập một điều khiển trên biểu mẫu, điều này đã ném một tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng (tại sao?).

Giải pháp cho tôi là thêm dòng mã sau vào đầu hàm tải biểu mẫu gốc. Tôi đang sử dụng VB nhưng nó là tương tự cho C#.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    If (DesignMode) Then Exit Sub 
+0

Trong trường hợp của tôi có mã khôi phục bố cục biểu mẫu trong OnLoad của cha mẹ. Rõ ràng nó không hoạt động tốt với nhà thiết kế WinForms. –

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