2014-07-18 26 views
8

Ich entwickle eine Windows-Anwendung, die auf der Windows-Formularvorlage basiert. Ich benutze .NET 3.5 Version. In dieser App ist das Ziel, dass alle visuellen Einstellungen der verschiedenen Formulare aus der App.Config-Datei verwaltet werden können (die Hintergrundfarbe, die Hintergrundfarbe der verschiedenen Schaltflächen usw.).Fehler: Der Dienst System.Windows.Forms.Design.IEventHandlerService ist bereits im Dienstcontainer vorhanden

Also im Grunde habe ich eine „FormBase“ Klasse, die alle meine Formulare erben, und diese Klasse enthält Code wie folgt aus:

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

Und dann habe ich meine App.Config Datei, die Code enthält, wie :

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

Und jetzt, in der Erklärung aller meiner Formen habe ich die Linie

public partial class Form1 : FormBase 

Mein Problem ist, wenn ich die App ausführe läuft es gut, und es funktioniert, die verschiedenen Farben in den App.Config-Dateien sind die Farben, die auf meinen Formularen angezeigt werden. Aber wenn ich an den Designern in Visual Studio anschauen, ohne die Anwendung ausgeführt wird, kann der Designer nicht angezeigt werden, was die Form aussehen wird und ich bekomme die folgenden Fehler

Den Service System.Windows.Forms.Design. IEventHandlerService ist bereits im Servicebehälter vorhanden. Parametername: serviceType

Und ich weiß nicht, wie man das löst. Das ist kein großes Problem, da die App sowieso gut läuft, aber das stört mich und ich würde gerne wissen, was passiert

Antwort

6

Ich bin gerade in dieses Problem selbst geraten. Laut einer anderen Webseite kann dieser Fehler behoben werden, indem Sie Visual Studio schließen und Ihren Ordner "obj" löschen, dann Visual Studio wieder öffnen und einen Projekt-Neuaufbau durchführen.

Hier ist die Seite, von der ich es gelesen habe. http://www.csharp411.com/ieventhandlerservice-already-exists-in-the-service-container/

Sie sagten, um den bin Ordner zu löschen, aber ich fand, dass ich nicht tun musste. Hoffe, das hilft!

+0

Ich habe versucht, aber es funktioniert nicht. Ich habe Visual Studio geschlossen, Ordner gelöscht, neu geöffnet und neu kompiliert. Ich habe auch versucht, Fully Solution zu reinigen. Nichts zu tun. –

+0

Arbeitete auch für mich. Ich hatte auch nur nur die 'obj' Ordner und nicht die' bin' Ordner – BigHeadCreations

0

Ich lief gerade in dieses Problem auch. Ich habe die obige Lösung versucht, und es hat nicht für mich funktioniert. Die Struktur ich habe, ist dies: public Form1: Form öffentlichen Form2: Form1 öffentlichen Form3: Form2

Ich habe versucht, den Wiederaufbau und das Löschen der obj/bin Ordner, konnte aber nicht diesen Fehler gehen weg. Schließlich als Plausibilitätsprüfung, änderte ich Form3 von der Windows Form-Klasse zu erben:

System.Windows.Forms.Form 

Dann wieder geöffnet ich Form3 im Designer, und es erschien (wie ich erwartet hatte). Ich habe dann Form3 zurück zu Erben von Form2 geändert und Form3 im Designer wieder geöffnet. Und es hat funktioniert.

# random-Bug-Fix-gewinnen

Viel Glück!

0

Ich habe meine Lösung gereinigt und umgebaut, um aus dieser Situation herauszukommen.

Prüfen Sie auch, ob Sie für die Form erweiterte Klasse verwendet und auch KeyEvent oder MouseEvent von Windows.Forms, sicher mit, dass Sie diese args von Windows.Forms.KeyEventArgs oder Windows.Forms.MouseEventArgs nennen.

1

Das funktionierte für mich, obwohl ich immer noch besser verstehen wollte, was schief lief. Ich habe in Visual Studio ein vererbtes Formular erstellt. Anscheinend ruft der Visual Studio-Designer die Load-Funktion auf, bevor das Formular angezeigt wird. Die Ladefunktion im übergeordneten Fenster wurde aufgerufen und auf ein Steuerelement im Formular zugegriffen. Dadurch wurde eine Objektreferenz ausgelöst, die nicht auf eine Instanz eines Objekts festgelegt wurde (warum?).

Die Lösung für mich bestand darin, die folgende Codezeile am Anfang der übergeordneten Formularladefunktion hinzuzufügen. Ich benutze VB, aber es ist ähnlich für C#.

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

In meinem Fall zu löschen gibt Code-Layout Wiederherstellen der Form in OnLoad der Eltern war. Anscheinend hat es mit WinForms Designer nicht gut funktioniert. –

Verwandte Themen