错误:服务 System.Windows.Forms.Design.IEventHandlerService 已存在于服务容器中

问题描述 投票:0回答:6

我正在开发一个基于 Windows 窗体模板的 Windows 应用程序。我正在使用.NET 3.5版本。在此应用程序中,目标是可以从 App.Config 文件管理不同表单的所有视觉设置(背景颜色、不同按钮的背景颜色等...)。

所以基本上,我有一个“FormBase”类,我的所有表单都继承该类,并且该类包含如下代码:

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
            }
        }
    }
}

然后我有我的 App.Config 文件,其中包含如下代码:

<?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>

现在,在我所有表格的声明中,我都有一行

public partial class Form1 : FormBase

我的问题是,当我运行应用程序时,它运行良好并且工作正常,App.Config 文件中的不同颜色是我的表单上显示的颜色。但是,当我只在 Visual Studio 中查看设计器而不运行应用程序时,设计器无法显示表单的外观,并且出现以下错误

服务容器中已存在 System.Windows.Forms.Design.IEventHandlerService 服务。参数名称:服务类型

我不知道如何解决这个问题。这不是一个大问题,因为应用程序无论如何都运行良好,但这让我很困扰,我想知道发生了什么

c# xml winforms inheritance app-config
6个回答
24
投票

我自己也遇到了这个问题。根据另一个网页,可以通过关闭 Visual Studio 并删除 obj 文件夹,然后重新打开 Visual Studio 并重新构建项目来修复此错误。

这是我阅读的页面。 http://www.csharp411.com/ieventhandlerservice-already-exists-in-the-service-container/

他们说也要删除 bin 文件夹,但我发现我不必这样做。 希望这有帮助!


6
投票

这对我有用,尽管我仍然想更好地了解出了什么问题。我正在 Visual Studio 中创建继承表单。显然,Visual Studio 设计器在显示表单之前调用 Load 函数。父窗口中的加载函数被调用并访问表单上的控件,这抛出了一个未设置为对象实例的对象引用(为什么?)。

我的解决方案是在父表单加载函数的开头添加以下代码行。我使用的是 VB,但 C# 的情况类似。

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

0
投票

我清理并重建了我的解决方案以摆脱这种情况。

还要检查您是否使用了 Form 的扩展类,并且还使用了

KeyEvent
中的
MouseEvent
Windows.Forms
,确保您通过
Windows.Forms.KeyEventArgs
Windows.Forms.MouseEventArgs
调用此参数。


0
投票

检查某个事件是否会在特定表单的打开或关闭时调用,一旦确定该事件,只需执行以下语句即可。希望它对你有用。

If (DesignMode) Then Exit Sub

0
投票

我也刚刚遇到这个问题。我尝试了上述解决方案,但它对我不起作用。我的结构是这样的:

公共表格1:表格

公开表格2 : 表格1

公开表格3 : 表格2

我尝试重建和删除 obj/bin 文件夹,但无法消除此错误。最后,作为健全性检查,我将 Form3 更改为从 Windows Form 类继承:

System.Windows.Forms.Form

然后我在设计器中重新打开Form3,它就出现了(如我所料)。然后我将 Form3 改回继承自 Form2 并在设计器中重新打开 Form3。它起作用了。

#随机错误修复-胜利

祝你好运!


0
投票

如果你像我一样使用很多固定类,(.net<5) then simply closing that tab and reopening that tab might fix your problem.

© www.soinside.com 2019 - 2024. All rights reserved.