Laden...

Warum kein Event...........

Erstellt von housefreak vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.885 Views
H
housefreak Themenstarter:in
238 Beiträge seit 2004
vor 17 Jahren
Warum kein Event...........

Hallo,

kann mir vielleicht jemand sagen warum im folgendem Code das Event nicht gefeuert wird?




    public delegate void MyValueChangeEventHandler(object sender, MyEventArgs e);


    public class MyEventArgs : EventArgs
    {
        public List<string> oldvalue = new List<string>();
        public List<string> newvalue = new List<string>();

        public MyEventArgs(List<string> _oldvalue, List<string> _newvalue)
        {
            newvalue = _newvalue;
            oldvalue = _oldvalue;
        }
    }

    class MyPlaylist_x
    {
        public event MyValueChangeEventHandler myChanging;
        protected List<string> myValue = new List<string>();

        public List<string> MyValue
        {
            get { return myValue;}
            set { if (myChanging != null)
            {
                myChanging(this, new MyEventArgs(myValue, value));}
            }
        }
    }



//aufrufen


        private static void test(object sender, MyEventArgs e)
        {
            MessageBox.Show("Hallo");
        }



        public void AddPlayListEntry(string[] entry)
        {
            //PlayListEntries.AddRange(entry);
            this.myPl.myChanging += new MyValueChangeEventHandler(test);
            myPl.MyValue.AddRange(entry);

        }



Das Problem ist jetzt, dass das Event nie ausgeführt wird, wenn ich über die Funktion AddPlayListEntry einen neuen eintrag hinzufüge.

Gruß

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo housefreak,

weil du MyValue nicht änderst. Mit myPl.MyValue.AddRange(entry) wird nur der Getter von MyValue aufgerufen.

herbivore

H
housefreak Themenstarter:in
238 Beiträge seit 2004
vor 17 Jahren

Und was muss ich daran ändern?

Wenn ich mir das im debugger ansehe wird doch der Wert für MyValue verändert?

Gruß

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo housefreak,

es wir der Inhalt des Objekts in MyValue verändert. Der Event schlägt aber nur zu, wenn ein (neues) Objekt am MyValue zugewisen wird. Das sind zwei paar Schuhe.

Ich sehe da keine andere Lösungsmöglichkeit, als eine eigene Collection zu implementieren, die ein Event wirft, wenn ihr Inhalt verändert wird.

herbivore

H
housefreak Themenstarter:in
238 Beiträge seit 2004
vor 17 Jahren

@herbivore

ist das viel aufwand, oder geht das und wenn ja wie implementiere ich sowas?

gruß

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo housefreak,

soviel ist das nicht. Spezielle Collections gibt es im Framework wie Sand am Meer (z.B. ControlCollection). Wie die Implementiert sind, kannst du dir ja mit dem Reflector angucken. Normalerweise haben die intern eine ArrayList, weil sie meist noch aus 1.0 stammen, aber du kannst stattdessen besser eine List<string> nehmen.

herbivore

564 Beiträge seit 2006
vor 17 Jahren

Hi housefreak!

Noch einfach wäre, wenn du

myPl.MyValue.AddRange(entry);

in einer öffentlichen Methode von MyPlaylist_x kapselst. So kannst du oben stehenden Zugriff in der Methode ausführen und mit dieser dann auch das Event feuern.

der Marcel

EDIT: letztenendes läuft ja herbivores Vorschlag fast auf das selbe hinaus. Nur eben eine extra Klasse mit Vererbung fällt dabei raus.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo der Marcel,

ob man die Collection-Zugriffe in einer Collection oder in der die Collection zur Verfügung stellen den Klasse kapselt, ist Geschmachssache. Einfacher ist das eine oder andere m.E. nicht.

herbivore