ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
1224
1224
EMPFEHLEN
-
Guten Abend,
ich habe vor mein Menu in meiner Anwendung aus einer XML-Datei auszulesen und anschließend darzustellen. Soweit kein Problem.
Jetzt möchte ich aber zusätzlich in der XML-Datei hinterlegen, welche Methode aufgerufen werden soll bei einem Klick auf ein Menuitem.
Und da taucht meine große Frage auf, wie kann ich die "richtige" Methode auswählen?
In meine XML-Datei schreibe ich zum Beispiel exit.
In meiner Anwendung gibt es die Methode exit(). Kann man erreichen, dass genau diese Methode aufgerufen wird? Wenn ja wie geht so etwas?
Sinnvoll wäre auch eine Prüfung, ob es die angegebene Methode überhaupt gibt...
Vielen Dank vorab und noch einen schönen Abend!
Jens
PS: Ich entwickle in Visual Studio 2005
-
25.07.06 23:37 #2
- Registriert seit
- Feb 2005
- Ort
- Kirchdorf a. d. Krems, OÖ
- Beiträge
- 213
Hi,
ich habe dir ein Beispiel gezimmert, du sollstest dich über die Reflections in C# informieren
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
using System; using System.Reflection; namespace Blubb { class Program { static void Main() { MethodenSammlung meineMethoden = new MethodenSammlung(); string methodenName = "exit"; //wird bei dir aus XML File geholt //jetzt methode aufrufen, deren Name in dem String steht MethodInfo info = meineMethoden.GetType().GetMethod(methodenName); try { info.Invoke(meineMethoden, null); } catch (NullReferenceException ex) { Console.WriteLine("Diese Methode gibts ja gar nich!"); } catch (TargetParameterCountException ex) { Console.WriteLine("Die Methode die aufgerufen wurde, wurde mit zu viel oder zu wenig Parametern aufgerufen!"); } catch (Exception ex) { Console.WriteLine(string.Format("Es ist ein Fehler beim Aufruf der Methode \"{0}\" aufgetreten.\n" + "Genauere Problembeschreibung:\n\n{1}", methodenName, ex.Message)); } Console.ReadKey(); } } class MethodenSammlung { public void exit() { Console.WriteLine("Das Programm wird jetzt geschlossen!"); //jetzt das Programm schließen //hmm... wie beendet man eigentlich eine Konsolen Anwendung :-D weiss jetzt nich } } }
Lg, Yanick
-
25.07.06 23:42 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
hier mal ein Beispiel wie man Dynamisch ein Menu über eine XML Datei Konfigurieren kann:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
using System; using System.Collections.Generic; using System.Reflection; using System.Text; using System.Xml; using System.Windows.Forms; namespace De.Tutorials.DynamicMenuCreationExample.Util { public class MenuBuilder { public static void BuildMenuFor(string menuDescriptorFilePath, MenuStrip menuStrip, Form form) { XmlDocument menuConfigrationDocument = new XmlDocument(); menuConfigrationDocument.Load(menuDescriptorFilePath); XmlNodeList menuNodes = menuConfigrationDocument.GetElementsByTagName("menu"); List<ToolStripItem> menus = new List<ToolStripItem>(); foreach (XmlNode menuNode in menuNodes) { string menuName = menuNode.Attributes["id"].InnerText; string menuCaption = menuNode.Attributes["caption"].InnerText; ToolStripMenuItem toolStripMenu = new ToolStripMenuItem(menuCaption); toolStripMenu.Name = menuName; menus.Add(toolStripMenu); List<ToolStripItem> menuItems = new List<ToolStripItem>(); foreach (XmlNode menuItemNode in menuNode.ChildNodes) { string menuItemName = menuItemNode.Attributes["id"].InnerText; string menuItemCaption = menuItemNode.Attributes["caption"].InnerText; string menuItemActionClassName = menuItemNode.Attributes["action-class"].InnerText; string menuItemActionMethodName = menuItemNode.Attributes["action-method"].InnerText; ToolStripMenuItem menuItem = new ToolStripMenuItem(menuItemCaption); menuItem.Name = menuItemName; if (menuItemActionClassName.Length > 1) { object menuItemActionInstance = Activator.CreateInstance(Type.GetType(menuItemActionClassName), new object[] { menuItemName,form}); Delegate clickEventHandler = System.Delegate.CreateDelegate(typeof(EventHandler), menuItemActionInstance, menuItemActionMethodName, true); menuItem.Click += (EventHandler)clickEventHandler; } menuItems.Add(menuItem); } toolStripMenu.DropDownItems.AddRange( menuItems.ToArray() ); } menuStrip.Items.AddRange( menus.ToArray() ); } } }
Menüs könnte man dann beispielsweise so deklarieren:
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14
<?xml version="1.0" encoding="utf-8" ?> <menus> <menu id="File" caption="File"> <menuitem id="File.Foo" caption="Foo" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.FooMenuAction" action-method="run"/> <menuitem id="File.Bar" caption="Bar" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.BarMenuAction" action-method="run"/> <menuitem id="File.Exit" caption="Exit" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.ExitMenuAction" action-method="run"/> </menu> <menu id="ABC" caption="ABC"> <menuitem id="ABC.Foo" caption="Foo" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.FooMenuAction" action-method="run"/> <menuitem id="ABC.Bar" caption="Bar" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.BarMenuAction" action-method="run"/> <menuitem id="ABC.Exit" caption="Exit" action-class="De.Tutorials.DynamicMenuCreationExample.Actions.ExitMenuAction" action-method="run"/> </menu> </menus>
Beispielprojekt ist Angehängt.
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Super, vielen Dank für Eure Antworten!
Einen schönen Tag,
Jens
-
Hallo,
ich habe leider noch mal eine "Anfängerfrage"...
Ich stehe dabei etwas auf dem Schlauch...
Ich habe das erste Beispiel von Yanick ausprobiert und folgendermaßen erweitert:
Code :1 2 3 4 5 6 7
class MethodenSammlung : Form1 { public void exit() { this.Exit(); } }
In meinem Formular (Form1) habe ich folgende Methode eingbaut:
Code :1 2 3 4
public void Exit() { this.Close(); }
Leider reagiert meine Anwendung nicht auf das this.Close()...
Habt ihr noch eine Idee?
Hintergrund ist, dass ich aus den aufzurufenden Methoden auf Objekte aus meinem Formular zu greifen möchte (ein paar Textboxen etc.). Deswegen wollte ich die Klasse MethodenSammlung als "Schnittstelle" nutzen, um meine vorhandenen Funktionen aufzurufen...
Würde mich über Eure neue Hilfe oder Anregung sehr freuen!
Viele Grüße
Jens
-
26.07.06 19:52 #6
- Registriert seit
- Feb 2005
- Ort
- Kirchdorf a. d. Krems, OÖ
- Beiträge
- 213
Hm...
Wenn du von einer Klasse erbst, ist es nicht die selbe Klasse, sondern die Klasse hat nur die selben Methoden etc..
Wenn du also this.Close() in einer geerbten Klasse aufrufst, bezieht sich das nur auf die aktuelle Klasse, was in deinem Fall nicht wirklich Sinn hat, da du in der Klasse MethodenSammlung das "geerbte" Formular gar nie aufrufst, egal, wieder zum Thema
:
Entweder du gibst der Methodensammlung die Form1 Klasse per Referenz weiter (beispielsweise über den Konstruktor: new MethodenSammlung(this); ), oder du tust die Methoden die du über XML Dateien aufrufen willst gleich in die Form1
Ob du sie in die Form1 Klasse packst oder nich das kommt darauf an, welche Methoden du alle Aufrufen willst, haben alle mit der Form1 Klasse zu tun, dann ist es logisch sie gleich da rein zu packen...
Lg, Yanick
-
Ja, sie haben alle mit meiner Form1 zu tun...
Ich habe es jetzt folgendermaßen umgebaut und jetzt klappt es wieder...
Code :1 2 3 4 5 6 7 8
... string methodenName = "appExit"; MethodInfo info = this.GetType().GetMethod(methodenName); try { info.Invoke(this, null); } ...
Vielen Dank nochmal
-
Hallo,
ich bin leider auf ein Problem gestoßen...
Und zwar rufe ich wie oben beschrieben meine Methode auf, so weit so gut.
Meine Methode sieht aber so aus:
Code :1 2 3 4 5 6 7 8
public void SendMail() { FrmInternalContacts personal = new FrmInternalContacts(); if (personal.ShowDialog() == DialogResult.OK) { ... } }
Ich erhalte die letzte Fehlermeldung von Yanick mit folgendem Hinweis:
"Exception has been thrown by the target of an invocation."
Könnt ihr bitte noch einmal helfen?
Meine Anwendung scheint mit dem Aufruf des Dialoges nicht zurechtzukommen...
Könnt ihr mir sagen woran das liegt, und wie man das Problem beheben kann?
Viele Grüße
Jens
-
02.08.06 21:29 #9
- Registriert seit
- Feb 2005
- Ort
- Kirchdorf a. d. Krems, OÖ
- Beiträge
- 213
Das kann man mit dieser Fehlermeldung noch nicht sagen...
Gib bitte mal die InnerException aus!
Wenn du Visual Studio hast kannst du extrem super debbuggen, schau mal nach bei welchem Code Schnippsel genau die Exception geworfen wird, dann kann mal schon mal mehr sagen
Lg, Yanick
-
Guten Morgen,
habe den Fehler gerade in dem Dialog gefunden, den ich aufrufen möchte...
Viele Grüße
Jens
-
Gib doch bitte der Problemstellung einen Sinn und erläuter mal woran es lag.
MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
Hi,
es lag daran, dass ich eine Zeile im Code in dem Dialog vergessen habe...
Ich wollte einer ArrayList etwas zu weisen, ohne dass ich eine neue Instanz aufgemacht habe...
Und da konnte das Programm natürlich nicht weiterarbeiten...
Beim Kompilieren gab es dafür keine Fehlermeldung...
Diese ist erst nach dem Schließen meines Dialoges aufgetreten.
Viele Grüße
Jens
Ähnliche Themen
-
cmd über Java steuern
Von pokke im Forum JavaAntworten: 7Letzter Beitrag: 09.01.11, 15:04 -
AE: Wav über Expression steuern
Von Trolleule im Forum Videoschnitt, Videotechnik & -produktionAntworten: 3Letzter Beitrag: 31.08.09, 21:01 -
Download über php Steuern
Von FlashMX im Forum PHPAntworten: 4Letzter Beitrag: 13.02.07, 03:05 -
GUI über Console steuern?
Von gott_ad im Forum .NET ArchivAntworten: 3Letzter Beitrag: 11.07.05, 13:21 -
[MX] Bildrate über AS steuern
Von rAvEnXXL im Forum Flash PlattformAntworten: 2Letzter Beitrag: 15.07.04, 01:04





Zitieren

Login





