65.9K
CodeProject is changing. Read more.
Home

List With Events

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (11 votes)

Dec 6, 2008

CPOL
viewsIcon

50406

downloadIcon

307

An extended List that fires events when the count of list-items changes

Introduction

List<T> provides no events when the count of the list-items is changed. This article provides a class that notifies with a event when the number of the elements is changed.

The class provides a basic approach to this. Further members can be added if needed.

Using the Code

An example will show the usage of this class:

using System;
using gfoidl.Tools;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main()
		{
			gfList<int> list = new gfList<int>();
			list.CountChanged += 
				new EventHandler<gfList<int>.ListEventArgs>
					(list_CountChanged);

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

			Console.ReadKey();
		}

		private static void list_CountChanged(
			object sender, 
			gfList<int>.ListEventArgs e)
		{
			Console.WriteLine(e.Count);
		}
	}
}

Implementation

using System;
using System.Collections.Generic;

namespace gfoidl.Tools
{
	/// <summary>
	/// Extended list with events
	/// </summary>
	/// <typeparam name="T">
	/// The type of the elements
	/// </typeparam>
	public class gfList<T> : List<T>
	{
		#region Event(s)
		public event EventHandler<ListEventArgs> CountChanged;
		#endregion
		//---------------------------------------------------------------
		#region Methods
		/// <summary>
		/// Adds an item
		/// </summary>
		public new void Add(T item)
		{
			base.Add(item);

			// Copy to a temporary variable to be thread-safe (MSDN).
			EventHandler<ListEventArgs> tmp = CountChanged;
			if (tmp != null)
			    tmp(this, new gfList<T>.ListEventArgs(this.Count));
		}
		//------------------------------------------------------------------
		/// <summary>
		/// Adds a range
		/// </summary>
		public new void AddRange(IEnumerable<T> collection)
		{
			base.AddRange(collection);

			// Copy to a temporary variable to be thread-safe (MSDN).
			EventHandler<ListEventArgs> tmp = CountChanged;
			if (tmp != null)
			    tmp(this, new gfList<T>.ListEventArgs(this.Count));
		}
		//------------------------------------------------------------------
		/// <summary>
		/// Clears the list.
		/// </summary>
		public new void Clear()
		{
			base.Clear();

			// Copy to a temporary variable to be thread-safe (MSDN).
			EventHandler<ListEventArgs> tmp = CountChanged;
			if (tmp != null)
			    tmp(this, new gfList<T>.ListEventArgs(this.Count));
		}
		//------------------------------------------------------------------
		/// <summary>
		/// Removes the first matched item.
		/// </summary>
		public new void Remove(T item)
		{
			base.Remove(item);

			// Copy to a temporary variable to be thread-safe (MSDN).
			EventHandler<ListEventArgs> tmp = CountChanged;
			if (tmp != null)
			    tmp(this, new gfList<T>.ListEventArgs(this.Count));
		}
		#endregion
		//------------------------------------------------------------------
		#region Subclasses
		/// <summary>
		/// EventArgs
		/// </summary>
		public class ListEventArgs : EventArgs
		{
			/// <summary>
			/// Number of elements in the list
			/// </summary>
			public int Count { get; set; }
			//----------------------------------------------------------
			public ListEventArgs(int anzahl)
			{
				this.Count = anzahl;
			}
		}
		#endregion
	}
}

History

  • 6th December, 2008: Initial release