Feedback

C# - Liste mit Ereignis bei Änderung der Elementanzahl

Veröffentlicht von am 12/6/2008
(2 Bewertungen)
Diese Implementierung einer Liste feuert ein Ereignis wenn sich die Anzahl der Listenelemente ändert.

Verwendung zB wenn in einer Anwendung Daten verwendet werden welche in einer (generischen) Liste gespeichert sind. Wird an "einem Ende" der Anwendung ein Element zur Liste hinzugefügt und soll am "anderen Ende" der Anwendung zB in einem Label die Anzahl der Elemente ausgegeben werden kann dies über das Ereignis erreicht werden.

Beispiel:

using System;
using gfoidl.Tools;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
gfList<int> list = new gfList<int>();
list.AnzahlGeändert +=
new EventHandler<gfList<int>.AnzahlEventArgs>(list_AnzahlGeändert);

list.Add(1);
list.AddRange(new int[] { 2, 3, 4, 5 });
list.Remove(3);
list.Clear();

Console.ReadKey();
}

private static void list_AnzahlGeändert(object sender, gfList<int>.AnzahlEventArgs e)
{
Console.WriteLine(e.Anzahl);
}
}
}


Die Klasse kann auch noch erweitert werden für alle Fälle der Manipulation der Listen-Elemente.
using System;
using System.Collections.Generic;

namespace gfoidl.Tools
{
	/// <summary>
	/// Stellt eine erweiterte List<(Of <(T>)>) dar die eine Ereignis bei
	/// Änderung der Anzahl der Listenelemente feuert.
	/// </summary>
	/// <typeparam name="T"></typeparam>
	public class gfList<T> : List<T>
	{
		#region Ereignisse
		/// <summary>
		/// Benachrichtigt über eine Änderung der Anzahl der Listenelemente
		/// </summary>
		public event EventHandler<AnzahlEventArgs> AnzahlGeändert;
		#endregion
		//---------------------------------------------------------------------
		/// <summary>
		/// Fügt am Ende der <c>gfList</c> ein Objekt des Typs T hinzu.
		/// </summary>
		/// <param name="item">
		/// Das Objekt, das am Ende der gfList hinzugefügt werden soll.
		/// Der Wert kann für Referenztype <c>null</c> sein.
		/// </param>
		public new void Add(T item)
		{
			base.Add(item);

			// In lokale Variable kopieren um threadsicher zu sein (laut MSDN):
			EventHandler<AnzahlEventArgs> tmp = AnzahlGeändert;
			if (tmp != null)
				tmp(this, new gfList<T>.AnzahlEventArgs(this.Count));
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Fügt die Elemente der angegebenen Auflistung am Ende der gfList
		/// hinzu.
		/// </summary>
		/// <param name="collection">
		/// Die Auflistung, deren Elemente am Ende von gfList hinzugefügt 
		/// werden sollen. Die Auflistung an sich kann nicht null sein, sie 
		/// kann jedoch Elemente enthalten, die null sind, wenn Typ T einen 
		/// Referenztyp darstellt.
		/// </param>
		public new void AddRange(IEnumerable<T> collection)
		{
			base.AddRange(collection);

			// In lokale Variable kopieren um threadsicher zu sein (laut MSDN):
			EventHandler<AnzahlEventArgs> tmp = AnzahlGeändert;
			if (tmp != null)
				tmp(this, new gfList<T>.AnzahlEventArgs(this.Count));
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Entfernt alle Elemente aus der gfList.
		/// </summary>
		public new void Clear()
		{
			base.Clear();

			// In lokale Variable kopieren um threadsicher zu sein (laut MSDN):
			EventHandler<AnzahlEventArgs> tmp = AnzahlGeändert;
			if (tmp != null)
				tmp(this, new gfList<T>.AnzahlEventArgs(this.Count));
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Entfernt das erste Vorkommen eines angegebenen Objekts aus gfList.
		/// </summary>
		/// <param name="item">
		/// Das aus dem gfList zu entfernende Objekt. Der Wert kann für 
		/// Referenztypen null sein.
		/// </param>
		public new void Remove(T item)
		{
			base.Remove(item);

			// In lokale Variable kopieren um threadsicher zu sein (laut MSDN):
			EventHandler<AnzahlEventArgs> tmp = AnzahlGeändert;
			if (tmp != null)
				tmp(this, new gfList<T>.AnzahlEventArgs(this.Count));
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Argumente des Ereignisses
		/// </summary>
		public class AnzahlEventArgs : EventArgs
		{
			/// <summary>
			/// Anzahl der Listenelemente
			/// </summary>
			public int Anzahl { get; set; }
			//-----------------------------------------------------------------
			public AnzahlEventArgs(int anzahl)
			{
				this.Anzahl = anzahl;
			}
		}
	}
}

2 Kommentare zum Snippet

Rainer Hilmer schrieb am 12/6/2008:
Hallo Günther,
was sind die Vorteile deines Snippets gegenüber einer ObservableCollection?
http://msdn.microsoft.com/en-us/library/ms668604.aspx
Gruß
Rainer
Günther Foidl schrieb am 12/6/2008:
Hallo Rainer,
bisher wusste ich nichts von der ObservableCollection - liegt wohl daran dass diese Klasse eher zu WPF gehört als zu Winforms ;)

Somit ist die ObserableCollection im Vorteil. Mein Snippet kann aber immer noch zu "Lernzwecken" verwendet werden.

Danke für den Hinweis.

mfG Günther
 

Logge dich ein, um hier zu kommentieren!