【问题标题】:Error : The service System.Windows.Forms.Design.IEventHandlerService already exists in the service container错误:服务容器中已存在服务 System.Windows.Forms.Design.IEventHandlerService
【发布时间】:2014-09-09 09:34:27
【问题描述】:

我正在开发基于 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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我试过了,但它不起作用。我关闭了Visual Studio,删除了文件夹,重新打开并重新编译描述。我也尝试清理完全解决方案。无事可做。
    • 也为我工作。我也只需要删除obj 文件夹而不是bin 文件夹
    • 我关闭了 VS 并在没有删除任何内容的情况下重新打开它,它成功了!!!! +1
    【解决方案2】:

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

    公共表格1:表格

    公共表格2:表格1

    公共 Form3 : Form2

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

    System.Windows.Forms.Form
    

    然后我在设计器中重新打开了 Form3,它出现了(正如我所料)。然后我将 Form3 改回从 Form2 继承并在设计器中重新打开 Form3。它奏效了。

    #random-bug-fix-win

    祝你好运!

    【讨论】:

      【解决方案3】:

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

      还要检查您是否使用了 Form 的扩展类,以及是否使用了来自 Windows.FormsKeyEventMouseEvent,请确保通过 Windows.Forms.KeyEventArgsWindows.Forms.MouseEventArgs 调用此参数。

      【讨论】:

        【解决方案4】:

        这对我有用,尽管我仍然想更好地了解出了什么问题。我在 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
        

        【讨论】:

        • 在我的例子中,在父母的 OnLoad 中有代码恢复表单布局。显然它不适用于 WinForms 设计器。
        【解决方案5】:

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

        If (DesignMode) Then Exit Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-13
          • 2020-12-18
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 2021-06-23
          • 1970-01-01
          相关资源
          最近更新 更多