[C#2.0] update notificatie op Collection<T>

Pagina: 1
Acties:

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 20:44
Ik wil een custom control maken die erft van Panel. Als property heb ik een custom collection van het type Collection<MyType>.

Nu wil ik tekenen op het moment dat er updates plaatsvinden op de collection.

Het geheel wil ik doen in de stijl van MS bij bijv. TabControl. Daar zie je ook een public property TabPages; dit is een collection. Als je er naar browse't dan zie je daar geen events op zitten. Ik krijg het namelijk niet voor elkaar om mijn eigen control te laten luisteren naar wijzigingen op de generic collection omdat deze geen events publiceert. Als je naar de TabPagesCollection kijkt zie je dat MS ook geen events publiekelijk heeft gemaakt.

code snippet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyControl : Panel
{
   private readonly Collection<MyType> _items = new Collection<MyType>;

   public MyControl()
   {
   }

   public Collection<MyType> Items
   {
      get
      {
          return _items;
      }
   }
}

[ Voor 3% gewijzigd door DrDelete op 24-11-2006 08:35 ]


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Je kunt heel eenvoudig een wrapper maken om de Collection<T> heen en dan de Add/Remove methods overriden en die een event laten raisen.
Zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyCollection<T> : Collection<T>
{
    public delegate void AddedEventHandler(object sender, EventArgs e);
    public event AddedEventHandler Added;

    public override void Add(T item)
    {
        base.Add(item);
        OnAdded();
    }

    private void OnAdded()
    {
        if(this.Added != null)
        {
            this.Added(this, new EventArgs());
        }
    }
}

[ Voor 62% gewijzigd door MTWZZ op 24-11-2006 08:43 ]

Nu met Land Rover Series 3 en Defender 90


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08 23:34
Is het Observer design pattern dan geen optie? Ik denk dat dit jouw probleem zal oplossen.

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Je Collectie laten overerven van Collection<T>, en de methods InsertItem, RemoveItem en ClearItems overriden zou voldoende moeten zijn om hetgeen jij wil mogelijk te maken.

https://fgheysels.github.io/


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 20:44
MTWZZ schreef op vrijdag 24 november 2006 @ 08:41:
Je kunt heel eenvoudig een wrapper maken om de Collection<T> heen en dan de Add/Remove methods overriden en die een event laten raisen.
Zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyCollection<T> : Collection<T>
{
    public delegate void AddedEventHandler(object sender, EventArgs e);
    public event AddedEventHandler Added;

    public override void Add(T item)
    {
        base.Add(item);
        OnAdded();
    }

    private void OnAdded()
    {
        if(this.Added != null)
        {
            this.Added(this, new EventArgs());
        }
    }
}
Events gebruiken is geen optie, MS gebruikt dit ook niet namelijk.

Ik ben via Reflector er achter gekomen hoe MS dit doet.

De custom collection heeft een constructor initializer die de custom control als owner ontvangt.

Nu kan ik de 3 overrides (insert, remove, set) gebruiken om rechtstreeks op de owner (lees: custom control) te proggen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
DrDelete schreef op vrijdag 24 november 2006 @ 09:22:
[...]


Events gebruiken is geen optie, MS gebruikt dit ook niet namelijk.

Ik ben via Reflector er achter gekomen hoe MS dit doet.

De custom collection heeft een constructor initializer die de custom control als owner ontvangt.

Nu kan ik de 3 overrides (insert, remove, set) gebruiken om rechtstreeks op de owner (lees: custom control) te proggen.
Hoezo is het geen optie omdat Microsoft het niet gebruikt? Wat Microsoft de beste manier vindt hoeft niet perse de beste manier voor jou te zijn.

Voor iets dergelijks heb ik idd een keer een Generic subclass van een List gemaakt. Dus iets als het volgende

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public clas ObservableList<T> : List<T>, IObservable
{
    public event EventHandler Updated;

    //Alle methods die wat aan de list verandere overidden en dan OnUpdated aanroepen
    protected void OnUpdated()
    {
        if( Updated != null )
            Updated( this, EventArgs.Empty );
    }
}

public interface IObservable
{
    event EventHandler Update;
}

[ Voor 29% gewijzigd door Woy op 24-11-2006 10:08 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Waarom custom events gaan toevoegen als de collection zelf al een mechanisme heeft waarmee je op de Add, Remove, ... kunt reageren ?

https://fgheysels.github.io/


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

whoami schreef op vrijdag 24 november 2006 @ 10:06:
Waarom custom events gaan toevoegen als de collection zelf al een mechanisme heeft waarmee je op de Add, Remove, ... kunt reageren ?
Via welke weg dan? Een Collection<T> doet vrij weinig behalve dingen opzuigen. Als je met een CollectionBase derived class werkt dan wordt het een ander verhaal want die voorziet wel in het notifceren van observers via OnInsert, OnRemove etc.

Nu met Land Rover Series 3 en Defender 90


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Zoals ik al zei: de virtual methods InsertItem etc... overriden. Die worden uitgevoerd als je een item aan je collection toevoegt, etc...

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Doe wat Whoami zegt, dat is de manier voor Collection<T>.

Wel wat gelimiteerd, maar hoeft geen probleem te zijn. Dat MS geen events toevoegt in allerlei winforms classes is echt eerder een teken aan de wand dat dat team er geen reet van begrijpt dan dat dat wijsheid is. Winforms zit belabberd in elkaar en we zouden allemaal beter af zijn als dat eerder vandaag dan morgen zou verdwijnen voor iets beters.

Implementeer dan ook IBindingList, zodat je een ListChanged event hebt dat je kunt raisen waarmee je meteen klaar bent. Je kunt dan ook denken aan een BindingList<T>, wat dit ook doet. Als het louter om de events gaat is dat wellicht ook een optie, die is er nl. al :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Collection<T> is geen WinForms class. :+

https://fgheysels.github.io/

Pagina: 1