Podpinanie eventów z innych komponentów

0

Hej,

Mam takie pytanie. Potrzebuję utworzyć na formularzu nowy komponent i podpiąć pod jego obsługę zdarzenia Click metodę obsługującą zdarzenie Click w innym komponencie.

W Delphi dało się to zrobić, zdaje się tak jakoś:

procedure (...).GetEvents( ... )
begin
  (...)
  vNewControl.OnClick := iOldControl.OnClik;
end;

Dodajmy, że potrzebuję to wszystko zrobić w klasie statycznej, w której w jednej z metod za parametr podaje kontrolkę.

Czy w C# jest coś takiego w ogóle możliwe?

0

Właśnie dostałem maila, z którego dowiedziałem się, że to co zdaje się być wielkie w języku C# jest równocześnie jego ogromnym OGRANICZENIEM:

You can't assign the event of another control in C# like you can in
Delphi. This has probably to do with the fact that in .NET you can
have multiple listners.

No cóż. Teraz trzeba pisać do twórcy C#, żeby przywrócił to co działało dobrze w Delphi :P

0

Napisz wlasny handler zdarzenia tego komponentu, ktory bedzie wywolywal akcje Click w drugim komponencie i po problemie :)

0

Tak prosta i genialna myśl mi nie wpadła do głowy. A kombinowałem w przeróżny sposób.
Bardzo mi pomogłeś :) Dziękuję:)

Tylko się zastanawiam chwilowo jak wywyołać akcję Click na drugim komponencie w C#.

..mhmm... to znów mam kolejny problem. Idę już do newbie z tym pytaniem.

0

Troche wiecej wywodow podalem w dziale delphi na temat c# :) wiec tu podam rozwiazanie o jakie zapewne tobie chodzilo (nie do konca moglem sie domyslic tego z tematu i podalem bardziej uniwersalne) a przekierowales czesciowo na ten temat.

vNewControl.Click += delegate(object asender, EventArgs ae) { iOldControl.PerformClick(); };
0

Próbuję zrobić to kopiowanie delegatów z jednej kontrolki do drugiej. Nie chce mi to działać jednak.

To Twój kod zamknięty w klasę. Potrzebuję, żeby zadzialał dla Compact Framework-a pod Windows CE, a uparcie odmawia skutecznej współpracy. Czuję się bezradny jak małe dziecko w urzędzie skarbowym.

Pod normalnym Frameworkiem działa!:)

    static class DelegatsCopier
    {
        static public void CopyDelegats(Control iSourceControl, Control iDestinationControl)
        {
            Type t = iSourceControl.GetType();
            Delegate[] de = null;
            do
            {
                FieldInfo[] fields = t.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
                foreach (FieldInfo field in fields)
                {
                  //if (field.Name == "EventClick")
                    {

                        //pobieramy zdarzenia
                        EventHandlerList eventHandlers = ((EventHandlerList)(iSourceControl.GetType().GetProperty("Events",
                            (BindingFlags.FlattenHierarchy | (BindingFlags.NonPublic |
                            BindingFlags.Instance))).GetValue(iSourceControl, null)));
                        Delegate d = eventHandlers[field.GetValue(iSourceControl)];
                        if ((!(d == null)))
                        {
                            de = d.GetInvocationList();
                        }
                    }
                }
                t = t.BaseType;
            } while (t != null);

            //kopiuj delegaty
            if (de != null)
            {
                for (int i = 0; i < de.Length; i++)
                {
                    iDestinationControl.Click += (EventHandler)de[i];
                }
            }
        }
    }
0

A dlaczego to wykomentowane (ok doczytalem w drugim watku :) )

//if (field.Name == "EventClick")

?

Tu jest wlasnie problem z nazwami, wylistuj sobie wszytskie moze event ma inna nazwe (patrzac na net znalazlem cos takiego EVENT_CLICK). Na pewno usuniecie warunku nie pomoze, wklej na forum jakie masz field.Name (np string s ="";
i w petli s += field.Name+"\n"; i albo kopiuj albo do pliku i wklej - ciekaw jestem.)

//------------- tak jak myslalem jest to pokrecone (trzeba by sie dokladnie wczytac w opis jak to sobie MS poukladal)

Na CF 5.0 z pocket emulatorem 2003 dziala mi to

Type t = button1.GetType();
            Delegate[] de = null;

            do
            {
             FieldInfo[] fields = t.GetFields( BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
             foreach (FieldInfo field in fields)
             {
                 
                 if (field.Name == "Click") // ?! moze tez tak zadziala w normalnym ?! spodziewam sie ze tak nie mam teraz czasu na testy
                    {
                        EventHandlerList eventHandlers = ((EventHandlerList)(button1.GetType().GetProperty("Events", 
                            (BindingFlags.FlattenHierarchy | (BindingFlags.NonPublic | 
                            BindingFlags.Instance))).GetValue(button1, null)));

                        Delegate d = (EventHandler)field.GetValue(button1); //tu zmiana
                        
                        if ((!(d == null)))
                        {
                           de = d.GetInvocationList();
                        }
                    }
                }
                t = t.BaseType;
            } while (t != null);

            if (de != null)
            {
                for (int i = 0; i < de.Length; i++)
                {
                    button2.Click += (EventHandler)de[i];
                }
            }
`</code>`
0

Genialne. U mnie na terminalu też wszystko super działa:D Jestem bardzo zadowolony... Dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1