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

Dev*_*Bob 9 c# xml inheritance app-config winforms

我正在开发基于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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的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>
Run Code Online (Sandbox Code Playgroud)

现在,在我所有表格的声明中,我都有这条线

public partial class Form1 : FormBase
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我运行应用程序它运行正常,它的工作原理,App.Config文件中的不同颜色是我的表单上显示的颜色.但是当我在没有运行应用程序的情况下在Visual Studio中查看设计器时,设计器无法显示表单的外观,我收到以下错误

Service.Windows.Forms.Design.IEventHandlerService服务已存在于服务容器中.参数名称:serviceType

我不知道如何解决这个问题.这不是一个大问题,因为应用程序运行正常,但这困扰我,我想知道发生了什么

Van*_*cio 14

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

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

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

  • 我关闭了 VS 并在没有删除任何内容的情况下重新打开,它起作用了!!!!+1 (4认同)

asc*_*ven 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
Run Code Online (Sandbox Code Playgroud)