我正在开发基于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
我不知道如何解决这个问题。这不是一个大问题,因为应用程序运行正常,但这困扰我,我想知道发生了什么
答案 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
中的MouseEvent
或Windows.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;
?>