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

时间:2014-07-18 09:35:05

标签: c# xml winforms inheritance app-config

我正在开发基于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已存在于服务容器中。参数名称:serviceType

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

5 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我也遇到了这个问题。我尝试了上面的解决方案,它对我不起作用。我的结构是这样的: 公共表格1:表格 公共表格2:表格1 公共表格3:表格2

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

System.Windows.Forms.Form

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

#随机错误修复赢

祝你好运!

答案 3 :(得分:0)

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

另外,请检查您是否对表单使用了扩展类,并使用KeyEvent中的MouseEventWindows.Forms,确保您通过Windows.Forms.KeyEventArgs或{{1}调用此args }。

答案 4 :(得分:0)

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

 <?php
    //for each category, show all posts
    $cat_args   = array(
        'orderby' => 'rand',
        'order' => 'ASC'
    );
    $limit      = 4;
    $counter    = 0;
    $categories = get_categories($cat_args);

    foreach ($categories as $category):
        if ($counter < $limit) {
            $args  = array(
                'showposts' => 3,
                'category__in' => array(
                $category->term_id
            ),
            'caller_get_posts' => 1
        );
        $posts = get_posts($args);
        if ($posts) {
            echo '<h3><a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . '>' . $category->name . '</a> </h3>';
            foreach ($posts as $post) {
                setup_postdata($post);
?>

<p><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>

<?php
            } // foreach($posts
        } // if ($posts
    } // foreach($categories
?>

<?php
    $counter++;
    endforeach;
?>