| 

.NET C# Java Javascript Exception

5
Ich versuche gerade ein eigenes WinForms-Steuerelement zur Programmieren, das Datensätze über hierarchisch angeordnete Strukturknoten ausgeben soll. Die Daten selbst werden über ein erweitertes Knotenobjekt MyTreeNode verwaltet, das seinerseits vom Objekt TreeNode abgeleitet ist. Es wird über eine Klasse definiert, die sich in der Steuerelementdatei zur Strukturansicht findet. Nachdem ich das Knotenobjekt definiert habe, habe ich das Steuerelement MyDataTree über eine weitere Klasse definiert. Dieses wird von TreeView abgeleitet. Damit eine Symbolanzeige unterstützt wird, habe ich bereits eine Bildliste des Typs ImageList in das Benutzersteuerelement aufgenommen und darüber die Bildsymbole direkt zugeordnet. In der Klasse zum Steuerelement wird mit den MyTreeNode-Knotenobjekten gearbeitet. Die Übersetzung erfolgt auch fehlerfrei (auch wenn einige Funktionen noch nicht implementiert sind). Ich habe jetzt versucht, das Steuerelement zu Testzwecken in ein neues Windows-Formular aufzunehmen, erhalte aber seltsamerweise folgende Fehlermeldung:

„Fehler beim Erstellen der Komponente MyDataTree. Die Fehlermeldung: System.Resources.MissingManifestResourceException: Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden. ….“.

Die Ressourcen, ich nehme an hier sind die Symbole gemeint, sind aber korrekt eingebunden. Wie kann ich diesen Fehler abstellen? Was habe ich falsch gemacht?
10.08.2013
Newbie 358 1 8
Ich habe fett hervorgehoben, was der Auslöser für das Problem ist (siehe unten).
Claus M. 12.08.2013
3 Antworten
2
Hmmm... klingt so, als ob Du den Aufbau der Quelldatei durcheinander gebracht hast. Nehmen wir an, Du hast eine Quelldatei mit dem Namen MyDataTree.vb und definierst darüber den erweiterten Treenode MyTreeNode und dann die Steuerelementklasse MyDataTree, die von TreeView abgeleitet ist (hier am Beispiel von VB.NET):

Public Class MyTreeNode
Inherits TreeNode
Property Wert1 As String = ""
...
Property WertN As String = ""
End Class

Public Class MyDataTree
Inherits Windows.Forms.TreeView
...
End Class


Das sind 2 Klassen, die der Compiler einordnen muss. Standardmäßig ist ein Steuerelement eine visuelle (!) Klasse. Per Definition muss diese visuelle Klasse immer an erster Stelle in einer Quelldatei definiert werden. Ansonsten kommt es tatsächlich zu fehlerhaften Ressourcenzuordnungen und daher qwerden diese Ressourcen nach der Übersetzung auch nicht mehr gefunden. Die korrekte Klassenanordnung sieht also wie folgt aus:

Public Class MyDataTree
Inherits Windows.Forms.TreeView
...
End Class

Public Class MyTreeNode
Inherits TreeNode
Property Wert1 As String = ""
...
Property WertN As String = ""
End Class


Am Quelltext selbst ändert sich also nichts. Dies erklärt auch, das der Compiler beide Varianten korrekt übersetzt und das es erst beim Verwenden der übersetzen Komponente zu dieser Fehlermeldung kommt. Eigentlich sollte sich damit Dein Problem lösen lassen. Wenn nicht, musst Du Deinen Quelltext wirklich offenlegen.
12.08.2013
Claus M. 2,9k 9
Das ist genau - zumindest bei dem von mir gewählten Ansatz - das Problem, danke! Ich verstehe aber nicht, warum nicht direkt der Hinweis auf die Anordnung der Klassen, sondern der Fehler mit den Ressourcen ausgegeben wird. Und was hat das ganze dann auch noch mit der Sprachkultur zu tun? Ich glaube, verstehen muss man das nicht! (diese Antwort von @newbie habe ich zu diesem Beitrag verschoben)
Andreas_mod 12.08.2013
Das eine bestimmte Reihenfolge bei der Definition von Klassen eingehalten werden muss, ist mir auch neu. Aber ich mach solche "Schweinereien" ;-)) eh nicht. Eine öffentliche Klasse (oder ein Interface, eine Enumeration usw.) liegt bei mir immer in einer eigenen Source-Datei (alleine schon deswegen, damit ich sie leichter im Solution-Explorer finde).
luedi 12.08.2013
1
Der Windows-Forms Designer hat so seine Macken. Du musst wissen, dass der Formular-Designer dein Formular ganz normal als Klasse instanziiert (d.h. dass der Konstruktor aufgerufen wird). Des weiteren hat der Formular-Designer als Wurzelverzeichnis das Verzeichnis, in dem devenv.exe liegt (als C:\Programme\....). Wenn du im Konstruktor z.B. eine Datei mit einer relativen Pfadangabe lädst, kann das Formular nicht angezeigt werden weil der Designer die Datei nicht finden kann.

Ich habe erfoglos versucht, dein Problem nachzustellen. Deshalb hier ein paar Fragen:

  • Welche Version von Visual Studio verwendest du?
  • Hast dein Steuerelement als User-Control oder als normale abgeleitete Klasse implementiert?
  • Wie sind die Symbole eingebunden? Hast du sie in einer Resource-Datei abgelegt oder im Code mit new Bitmap() angelegt?
  • Hast du dein Steuerelement in einer separaten Visual-Studio Instanz getestet oder hast du in deiner Solution mit dem Steuerelement ein Projekt zum Testen angelegt?

    Es wäre auch schön, wenn du die wesentlichen Code-Teile hier posten würdest. Möglicherweise sieht man das Problem dann auf den ersten Blick.

    Gruß
    Klaus
  • 11.08.2013
    luedi 2,2k 1 9
    Ich verwende VS 2012. Das Steuerelement ist nicht von UserControl, sondern von TreeView abgeleitet. In den Entwurfsbereich habe ich eine ImageList platziert und darüber die Abbildungen im Dialog direkt zugewiesen. VS hängt die Ressourcen also direkt an das Control. Alle Formulare und Controls, sind Bestandteil desselben Projektes.
    Newbie 11.08.2013
    So leid es mir tut, ich kann dein Problem nicht nachvollziehen. Ich habe das Beispielprogramm auf mein skydrive geladen (http://sdrv.ms/19XZ2v5), vielleicht hilft es dir ja, wenn du den Code siehst.
    luedi 12.08.2013
    Ich habe Deine C#-Variante mal verfolgt und anders als bei mir, befinden sich die Klassen MyTreeNode und MyTreeView nicht in einer einzelnen Quelldatei.
    Newbie 12.08.2013
    +1 da ich damit das Problem auch gelöst hätte, danke für deine Mühe!!!!
    Newbie 12.08.2013
    0
    Das ist genau - zumindest bei dem von mir gewählten Ansatz - das Problem, danke! Ich verstehe aber nicht, warum nicht direkt der Hinweis auf die Anordnung der Klassen, sondern der Fehler mit den Ressourcen ausgegeben wird. Und was hat das ganze dann auch noch mit der Sprachkultur zu tun? Ich glaube, verstehen muss man das nicht!
    12.08.2013
    Newbie 358 1 8

    Stelle deine .net-Frage jetzt!
    TOP TECHNOLOGIES CONSULTING GmbH