Forum: PC-Programmierung C#, Delegaten von Events


von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Hallo,
Ich möchte Objekte zur Laufzeit Konvertieren. z.B. von Label zu 
Button, oder Class1 zu Class2. Dabei sollen alle gleichen Member 
(Felder, Propertys, usw) in einer Schleife übernommen werden. Das klappt 
auch ganz gut. Allerdings komme ich bei den Events nicht mehr weiter, 
und hänge bereits ca eine Woche an diesem Punkt fest.

Es sollen alle "registrierten und möglichen Events" der Class1 später 
von der konvertierten Class2 aufgerufen werden können. Diese Events 
(und alle anderen Member) sollen von "Außen" abgefragt werden 
(Konvertierungs-Klasse), also nicht dort, wo die Class1 Instanz liegt. 
Alle Member und Klassen, auch die Methoden sind Public. Müsste ja 
eigentlich gehen!

Ich bekomme eine Liste der benutzen Delegaten (die Methoden der Events) 
eines Objektes:  ...
1
Class1 Class1 = new Class1();
2
EventHandlerList events = (EventHandlerList)Class1.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Class1, null);
...Jedoch kann ich diese nicht mehr den Events zuordnen. Dort stehen 
dann wirklich NUR die Delegaten/Methoden, und der 
EventHandlerList.Key-Property ist immer leer!?? Mittlerweile ist es ein 
ebiges hin und her mit diversen Snippets, und leider finde ich keinen 
Weg.

Ich bräuchte als Result etwa so was:
1
-Object: Class1
2
-EventList:
3
  -EventInfo Click, Delegate ClickHandlerMethod
4
  -EventInfo MouseMove, Delegate MoveHandlerMethod
5
  -EventInfo AbcEvent, Delegate AbcHandlerMethod,

...Also ich bräuchte einen Delegate oder MethodInfo passend zur 
Eventinfo zur Laufzeit. Dann kann ich diese auf der Class2 anwenden 
bzw. anmelden. Kann mir jemand weiterhelfen?

Gruß, tsx

: Bearbeitet durch User
von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

So sieht das bisher ungefähr aus:

Propertys:
1
public static Boolean MappingProperty(Object Source, Object Dest, String PropertyName)
2
{
3
  Boolean Done = false;
4
  if (Source != null && Dest != null && PropertyName != String.Empty)
5
  {
6
    PropertyInfo SourceInfo = Source.GetType().GetProperty(PropertyName);
7
    PropertyInfo DestInfo = Dest.GetType().GetProperty(PropertyName);
8
    if (SourceInfo != null && DestInfo != null && SourceInfo.PropertyType == DestInfo.PropertyType && SourceInfo.CanRead && DestInfo.CanWrite)
9
    {
10
      DestInfo.SetValue(Dest, SourceInfo.GetValue(Source));
11
      Done = true;
12
    }
13
  }
14
  return Done;
15
}


Felder:
1
public static Boolean MappingField(Object Source, Object Dest, String FieldName)
2
{
3
  Boolean Done = false;
4
  if (Source != null && Dest != null && FieldName != String.Empty)
5
  {
6
    FieldInfo SourceInfo = Source.GetType().GetField(FieldName);
7
    FieldInfo DestInfo = Dest.GetType().GetField(FieldName);
8
9
    if (SourceInfo != null && DestInfo != null && SourceInfo.FieldType == DestInfo.FieldType)
10
    {
11
      DestInfo.SetValue(Dest, SourceInfo.GetValue(Source));
12
      Done = true;
13
    }
14
  }
15
  return Done;
16
}


Aber wie mache ich das bei den Events?:
1
public static Boolean MappingEvent(Object Source, Object Dest, String EventName)
2
{
3
  Boolean Done = false;
4
5
  // WTF!?
6
7
  return Done ;
8
}

Ich würde auch belohnen! Bierchen oder sowas. Ist Mega-Wichtig!

von Monomops (Gast)


Lesenswert?

Tim S. schrieb:
> Ich bräuchte als Result etwa so was:
> -Object: Class1
> -EventList:
>   -EventInfo Click, Delegate ClickHandlerMethod
>   -EventInfo MouseMove, Delegate MoveHandlerMethod
>   -EventInfo AbcEvent, Delegate AbcHandlerMethod,

Meinst du etwas in dieser Richtung?

1
namespace Bla
2
{
3
  class Foo
4
  {
5
    public event EventHandler EventW;
6
    public event EventHandler EventX;
7
    public event EventHandler EventY;
8
    public event EventHandler EventZ;
9
10
    public Foo()
11
    {
12
      EventW += Foo_x;
13
      EventX += Foo_y;
14
    }
15
16
    public void Foo_x(object sender, EventArgs e) {}
17
    public void Foo_y(object sender, EventArgs e) {}
18
  }
19
20
  class Program
21
  {
22
    static void Main(string[] args)
23
    {
24
      var foo = new Foo();
25
26
      foo.EventY += MyHandler;
27
      foo.EventZ += (s, e) => { };
28
29
      var events = foo.GetType().GetEvents();
30
    
31
      foreach (var ev in events)
32
      {
33
        FieldInfo fi = foo.GetType().GetField(ev.Name, BindingFlags.NonPublic | BindingFlags.Instance);
34
        Delegate del = (Delegate)fi.GetValue(foo);
35
        var invocationList = del.GetInvocationList();
36
        foreach (var d in invocationList)
37
        {
38
          Console.WriteLine("{0}, {1}, {2}", ev.Name, d.Target, d.Method.Name);
39
        }
40
      }
41
    }
42
43
    private static void MyHandler(object sender, EventArgs e) { }
44
  }
45
}

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Monomops schrieb:
>
1
FieldInfo fi = foo.GetType().GetField(ev.Name, BindingFlags.NonPublic | BindingFlags.Instance);
2
Delegate del = (Delegate)fi.GetValue(foo);

Genau das habe ich auch mehrfach gefunden und getestet. FieldInfo fi ist 
immer null.

Tim S. schrieb:
> Diese Events und alle anderen Member sollen von "Außen" abgefragt werden

...also von einer Converter-Klasse! (ConvertFooBarBaz)
Eventuell geht das doch nicht!?
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Reflection;
5
using System.Text;
6
using System.Threading.Tasks;
7
namespace Bla
8
{
9
    // Klassen, dessen Member-Inhalte zu "konvertieren" bzw zu übernehmen sind.
10
    // Verschiedene Klassen, mit den selben Member-Namen und Typen (vererbt!)
11
    // z.B bei allen Controls, Usercontrols: "BackColor".
12
13
    // Foo:
14
    public class Foo
15
    {
16
        public const String Const = "Das ist Foo";
17
        public String String = "Der Foo String";
18
        public int Number = 1;
19
        public String DerFooMember = "Foo";
20
        public event EventHandler EventX;
21
        public event EventHandler EventY;
22
23
        public void X()
24
        {
25
            EventX?.Invoke(this, new EventArgs());
26
        }
27
        public void Y()
28
        {
29
            EventY?.Invoke(this, new EventArgs());
30
        }
31
    }
32
33
    // Bar:
34
    // Das selbe wie Foo, nur "anders" parametriert.
35
    public class Bar
36
    {
37
        public const String Const = "Das ist Bar";
38
        public String String = "Der Bar String";
39
        public int Number = 2;
40
        public String DerBarMember = "Bar";
41
        public event EventHandler EventX;
42
        public event EventHandler EventY;
43
44
        public void X()
45
        {
46
            EventX?.Invoke(this, new EventArgs());
47
        }
48
        public void Y()
49
        {
50
            EventY?.Invoke(this, new EventArgs());
51
        }
52
    }
53
54
55
// *************************************************************
56
57
    // Mögliche Inhalte zwischen den Klassen austauschen.
58
    public static class ConvertFooBarBaz
59
    {
60
        public static void MappingProperty(Object Source, Object Dest, String PropertyName) { }  // Siehe Post 2
61
        public static void MappingField(Object Source, Object Dest, String FieldName) { }        // Siehe Post 2
62
        public static void MappingEvent(Object Source, Object Dest, String EventName)  // Die eigentliche Frage
63
        {
64
            // ?????? How to do this!?
65
        }
66
67
        // Diese Funktion soll das für alle Member-Typen gemeinsam machen:
68
        public static Boolean MappingObject(Object Source, Object Dest)
69
        {
70
            foreach (PropertyInfo pi in Source.GetType().GetProperties())
71
            {
72
                MappingProperty(Source, Dest, pi.Name);
73
            }
74
            foreach (FieldInfo fi in Source.GetType().GetFields())
75
            {
76
                MappingField(Source, Dest, fi.Name);
77
            }
78
            foreach (EventInfo ev in Source.GetType().GetEvents())
79
            {
80
                MappingEvent(Source, Dest, ev.Name);
81
            }
82
            return true; //return Done;
83
        }
84
    }
85
86
// *************************************************************
87
88
    class Program
89
    {
90
91
        static void Main(string[] args)
92
        {
93
            Foo foo = new Foo();
94
            foo.EventX += MyHandler;
95
            foo.EventY += (s, e) => { };
96
            // Soweit so gut;
97
98
99
            Bar bar = new Bar();
100
101
            // Events und alle anderen Member sollen von "Außen" abgefragt werden (*1)
102
            // (ConvertFooBarBaz-Klasse), und nicht hier im MainCode, in dem die Foo Instanz liegt.
103
104
            ConvertFooBarBaz.MappingObject(foo, bar);
105
106
            // nun sollte Bar folgende Werte angenommen haben:
107
            // bar.Const = "Das ist Bar";      // Bleibt Const;
108
            // bar.String = "Der Foo String";  // (war vorher "Der Bar String");
109
            // bar.Number = 1;                 // (war vorher 2);
110
            // bar.DerBarMember = "Bar";       // Bleibt unverändert, da eigener PropertyName von bar;
111
            // bar.EventX;                     // ist nun bei MyHandler "angemeldet";
112
            // bar.EventY;                     // ist nun bei emptyFx => { }  "angemeldet";
113
114
115
            Parent.Controls.Remove(foo);
116
            foo.Dispose();
117
            // ... mit "bar" weitermachen, das die Werte von "foo" angenommen hat....
118
            Parent.Controls.Add(bar);
119
        }
120
121
        // alle Handler müssen daher(*1) auch public sein (???) !!!    
122
        public static void MyHandler(object sender, EventArgs e) { }
123
    }
124
}


Es ist kein "konvertieren" oder "mappen" im eigentlichen Sinne, sondern 
lediglich das Übernehmen der einzelnen Werte auf ein anderes Objekt. Es 
fehlen nur noch die Events. Hoffentlich ist verständlich was ich meine. 
Habe das grob reduziert!

Bestimmt gibt es das auch schon irgendwo als Snippet im Netz? Ich finde 
jedoch gar nichts. Wonach soll ich eigentlich suchen!?
Danke für die Hilfe! tsx

: Bearbeitet durch User
von Frank L. (frank_l)


Lesenswert?

Hallo,

schau Dir das mal näher an. Ich kann Dir allerdings nicht sagen, ob das 
Teil auch Events kopiert.

http://circlesandcrossesblogarchive.blogspot.de/2008/01/extension-methods-for-copying-or.html

Gruß
Frank

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Ich habe versucht die Methode von Monomops zu verwenden
FieldInfo fi = foo.GetType().GetField(ev.Name, BindingFlags ...);
FieldInfo fi = foo.GetType().GetField("Event"+ ev.Name, BindingFlags ... 
);

Was der Compiler an Feldern pro Event baut weiß ich noch nicht, und auch 
nicht wie ich darauf zugreifen kann...
FeldInfos sind wie gesagt immer null!!

Ich habe versucht die Eventhandler mit Attributen zu finden.
z.B. Die Methode ClickHandler mit einem ClickHandlerAttribute schmücken.
Bringt aber nichts, gefällt mir nicht und schaff ich auch gar nicht 
erst. Jede Funktion bräuchte eine eigene Attribute und das ist 
Schwachsinn und viel zu statisch für das Projekt.

Ich überlege mir eine Art Liste aufzubauen, die darüber bescheid weiß, 
welches Event zu welchen Delegaten und Handler gehört. Diese wird dann 
zur Laufzeit erweitert oder verändert.

Tim S. schrieb:
> Wonach soll ich eigentlich suchen!?
Event Publisher/Subscriber Pattern anscheinend.

Jedoch denke ich, dass es oben genannten Snippet schon fertig gibt, es 
ist doch bestimmt wichtig mal Class1 nach Class2 zu "wandeln"!? Warum 
gibt es das nicht!? Das braucht doch gefühlt jeder Mensch hunderte male 
am Tag! Ohne scheiß! Muss man das mit jeden Member statisch einzeln 
machen!? - Wäre doch ultra schwach von .Net

Hat jemand vielleicht noch einen Tipp???
tsx

Edit:
Frank L. schrieb:
> Gruß
> Frank

Danke, ich schau mal rein!

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Mal davon abgesehen, dass es sich mir nicht erschließt, welchen Sinn es 
macht, Felder von Label nach Button zu kopieren und dabei auch noch die 
Event-Handler (Verweise auf Programm-Code!) kopieren zu wollen... Wobei 
ich das natürlich nicht verstehen muss... ;-)

Schreibe doch mal ein kleines Test-Programm und schaue dir die erzeuge 
Assembly mit ILDASM an. Das ist ein Tool des DotNet-Frameworks, in dem 
Du den erzeugten IL-Code anschauen kannst. Dort wirst Du recht schnell 
finden, welche "Felder" der C#-Compiler bei Events verwendet.

Grüße
Markus

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Markus schrieb:
> welchen Sinn es macht

Ich baue ein GUI und möchte grad Drag&Drop einbauen bzw vorbereiten. Ich 
suche eine universelle Möglichkeit, um ein Element (z.B) vom TreeView in 
ein Panel zu Draggen - oder von dort aus in ein ToolStrip, (etc...) und 
möchte dessen Eigenschaften auf das neue Controll anwenden 
(konvertieren), ohne alles Statisch machen zu müssen. Das funktioniert - 
nur eben die Events noch nicht.

Markus schrieb:
> schaue dir die erzeuge Assembly mit ILDASM an

Kann das mehr als Reflection zur Laufzeit? Meinst du das vom Win SDK? 
(Lade ich grad runter)

von Frank L. (frank_l)


Lesenswert?

Hallo Tim,

versuch es mal damit:
1
    public partial class Form1 : Form
2
    {
3
        public Form1()
4
        {
5
            InitializeComponent();
6
        }
7
8
        private bool _initialize = false;
9
        private void button1_Click(object sender, EventArgs e)
10
        {
11
            if (_initialize) return;
12
            try
13
            {
14
                _initialize = true;
15
                var events = button1.GetType().GetEvents();
16
17
                var test = new Button();
18
                Controls.Add(test);
19
                var events2 = test.GetType().GetEvents();
20
                foreach (var eventInfo in events2)
21
                {
22
                    EventInfo eventOldInfo = findInEvents(events, eventInfo);
23
                    if (eventOldInfo != null)
24
                    {
25
                        try
26
                        {
27
                            //                        var method = eventOldInfo.AddMethod;
28
                            //                        Delegate handler = Delegate.CreateDelegate(eventOldInfo.EventHandlerType, null, method, false);
29
30
                            FieldInfo f1 = typeof (Control).GetField("EventClick",
31
                                BindingFlags.Static | BindingFlags.NonPublic);
32
                            PropertyInfo pi = button1.GetType()
33
                                .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
34
                            EventHandlerList list = (EventHandlerList) pi.GetValue(button1, null);
35
36
                            PropertyInfo pi2 = test.GetType()
37
                                .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
38
                            EventHandlerList list2 = (EventHandlerList) pi2.GetValue(test, null);
39
                            list2.AddHandlers(list);
40
                        }
41
                        catch (Exception ex)
42
                        {
43
                            if (ex == null);
44
                        }
45
                    }
46
                }
47
            }
48
            finally
49
            {
50
                _initialize = false;
51
            }
52
        }
53
54
        private EventInfo findInEvents(EventInfo[] events, EventInfo searchEventInfo)
55
        {
56
            foreach (var eventInfo in events)
57
            {
58
                if (eventInfo.Name == searchEventInfo.Name) return eventInfo;
59
            }
60
            return null;
61
        }
62
    }

Gruß
Frank

von Frank L. (frank_l)


Lesenswert?

Hallo Tim,

und hier die verkürzte Version ohne foreach Schleife.
1
    public partial class Form1 : Form
2
    {
3
        private Button button1;
4
5
        public Form1()
6
        {
7
            InitializeComponent();
8
            button1 = new Button {Dock = DockStyle.Top};
9
            button1.Click += button1_Click;
10
            button1.Text = "Click mich";
11
            Controls.Add(button1);
12
        }
13
14
        private bool _initialize = false;
15
        private void button1_Click(object sender, EventArgs e)
16
        {
17
            if (_initialize) return;
18
            try
19
            {
20
                _initialize = true;
21
22
                var test = new Button
23
                {
24
                    Text = "Kopie",
25
                    Dock = DockStyle.Left
26
                };
27
                Controls.Add(test);
28
                try
29
                {
30
                    FieldInfo f1 = typeof (Control).GetField("EventClick",
31
                        BindingFlags.Static | BindingFlags.NonPublic);
32
                    PropertyInfo pi = button1.GetType()
33
                        .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
34
                    EventHandlerList list = (EventHandlerList) pi.GetValue(button1, null);
35
36
                    PropertyInfo pi2 = test.GetType()
37
                        .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
38
                    EventHandlerList list2 = (EventHandlerList) pi2.GetValue(test, null);
39
                    list2.AddHandlers(list);
40
                }
41
                catch (Exception ex)
42
                {
43
                    if (ex == null);
44
                }
45
            }
46
            finally
47
            {
48
                _initialize = false;
49
            }
50
        }
51
52
    }

Gruß
Frank

von c-hater (Gast)


Lesenswert?

Tim S. schrieb:

> Ich baue ein GUI und möchte grad Drag&Drop einbauen bzw vorbereiten. Ich
> suche eine universelle Möglichkeit, um ein Element (z.B) vom TreeView in
> ein Panel zu Draggen - oder von dort aus in ein ToolStrip, (etc...) und
> möchte dessen Eigenschaften auf das neue Controll anwenden
> (konvertieren), ohne alles Statisch machen zu müssen. Das funktioniert -
> nur eben die Events noch nicht.

Das ist doch ausgekochter Schwachsinn hoch drei. Drag&Drop: OK. Elemente 
zwischen verschiedenen "Containern" transferieren: auch OK.

Der Punkt ist aber: die Tatsache, dass "Elemente" zwischen verschiedenen 
"Containern" hin und her transferiert werden, ändert erstmal rein garnix 
an den transferierten Elementen selber, weder an deren Inhalt noch an 
deren Typ (also deren Klasse). Und das muss es auch nicht, denn alles, 
was sich tatsächlich ändert, ist ja die Position im Container oder 
maximal der Container selber.

Dein Problem kann also allenfalls sein, die Elemente an die Ereignisse 
des neuen Containers zu koppeln.

Kannst du dass mal langsam im Rahmen deiner intellektuellen 
Möglichkeiten durchdenken und dann ggf. bestätigen?

Weil: wenn die Antwort "ja" ist, könnte man der Lösung deines Problems 
doch schon sehr viel näher kommen...

von Frank L. (frank_l)


Lesenswert?

Geht auch mit einem anderem Control als Ziel:
1
        private void button1_Click(object sender, EventArgs e)
2
        {
3
            var test = new LinkLabel()
4
            {
5
                Text = "Kopie",
6
                Dock = DockStyle.Left
7
            };
8
            Controls.Add(test);
9
            try
10
            {
11
                FieldInfo f1 = typeof (Control).GetField("EventClick",
12
                    BindingFlags.Static | BindingFlags.NonPublic);
13
                PropertyInfo pi = button1.GetType()
14
                    .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
15
                EventHandlerList list = (EventHandlerList) pi.GetValue(button1, null);
16
17
                PropertyInfo pi2 = test.GetType()
18
                    .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
19
                EventHandlerList list2 = (EventHandlerList) pi2.GetValue(test, null);
20
                list2.AddHandlers(list);
21
            }
22
            catch (Exception ex)
23
            {
24
                if (ex == null) ;
25
            }
26
        }

Gruß
Frank

von Frank L. (frank_l)


Lesenswert?

c-hater schrieb:
> Das ist doch ausgekochter Schwachsinn hoch drei. Drag&Drop: OK. Elemente
> zwischen verschiedenen "Containern" transferieren: auch OK.
>
> Der Punkt ist aber: die Tatsache, dass "Elemente" zwischen verschiedenen
> "Containern" hin und her transferiert werden, ändert erstmal rein garnix
> an den transferierten Elementen selber, weder an deren Inhalt noch an
> deren Typ (also deren Klasse). Und das muss es auch nicht, denn alles,
> was sich tatsächlich ändert, ist ja die Position im Container oder
> maximal der Container selber.
>
> Dein Problem kann also allenfalls sein, die Elemente an die Ereignisse
> des neuen Containers zu koppeln.
>
> Kannst du dass mal langsam im Rahmen deiner intellektuellen
> Möglichkeiten durchdenken und dann ggf. bestätigen?
>
> Weil: wenn die Antwort "ja" ist, könnte man der Lösung deines Problems
> doch schon sehr viel näher kommen...

Und Deine Antwort ist an Schwachsinn nicht zu übertreffen. Denk mal 
weiter als Dein Tellerrand, dann fallen Dir wahrscheinlich mehr als ein 
paar Dinge ein, bei denen ein Button auf einmal ein MenueItem sein 
könnte oder sonstiges...

Gruß
Frank

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Frank L. schrieb:
> Hallo Tim,
> und hier die verkürzte Version ohne foreach Schleife.

Joaa genau das brauche ich. Hatte ich zuvor auch schon mehrfach 
gefunden, jedoch funktionierte das nicht wirklich... Das jetzt läuft 
schon besser, und bringt mich erstmal weiter... Dankeschön

Tim S. schrieb:
> Ich habe versucht die Methode von Monomops zu verwenden
1
FieldInfo fi = foo.GetType().GetField("Event"+ ev.Name, BindingFlags ..);
> FieldInfo fi ist immer null.


Frank L. schrieb:
1
          ...
2
             try
3
             {
4
                 FieldInfo f1 = typeof (Control).GetField("EventClick",
5
                     BindingFlags.Static | BindingFlags.NonPublic);
6
             ...
7
             }

Auch diese FieldInfo f1 ist hier null, aber anscheinend braucht die eh 
niemand! :-) LOOL

Tim S. schrieb:
> Mittlerweile ist es ein ebiges hin und her mit diversen Snippets

Wie oft ich zuvor beim Debuggen dieser vielen Online-Fetzen abgebrochen 
habe, nur weil diese fi null ist ... AHHRRG! - den ganzen Part danach 
habe ich nicht mehr debuggt oder getestet. Dabei hatte es anscheinend 
schon ansatzweise funktioniert. Jedoch fehlte mir folgende Zeile:

Frank L. schrieb:
1
list2.AddHandlers(list);

Das löst eigentlich alle Probleme mit einem Schlag! Ich hatte zuvor die 
EventHandlerList in irgendwelche Dictionarys gewandelt, um an die 
Delegaten / MethodInfos zu kommen, und die Events dann alle "manuell" 
dort anzumelden. Deine Zeile macht das alles von alleine! ;-)

c-hater schrieb:
> Weil: wenn die Antwort "ja" ist, könnte man der Lösung deines Problems
> doch schon sehr viel näher kommen...

Frank L. schrieb:
> ...dann fallen Dir wahrscheinlich mehr als ein
> paar Dinge ein, bei denen ein Button auf einmal ein MenueItem sein
> könnte oder sonstiges...

Joaa genau das habe ich gemeint!
Ich stelle mein Code dann hier rein wenn er fitt geworden ist.
Danke an alle und dir Frank!
tsx

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

1
convert.Control(a1, b1);     // Alle Member
2
convert.Events(a1, b1);         // Events
3
convert.Fields(a1, b1);         // Felder
4
convert.Propertys(a1, b1);      // Propertys

Beim "konvertieren" der Felder werden die Events jetzt auch irgendwie 
übernommen. Also eigentlich war´s umsonnst! Trotzdem Danke für jede 
Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.