Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Книги по теме

Искать:
в:
Порядок:

Исходник

Автор:

Nik Legaloff

 
Название:

Компонент - помошник.

Дата: 09 August 2005
Описание: В случае если вы биндите грид(даталист, репитер) коллекцией обьектов своего типа то как правило имена полей приходится вписывать вручную. Этот компонент позволяет вам в design-time видеть все поля типа, которым вы биндите грид. Вытаскиваем компонент на форму. В нём нужно указать имя сборки, в которой находится ваш тип(которым вы биндите грид) и его полное имя. Потом у грида выбираем компонент в качестве датасорса. Кроме этого нужно навесить свой обработчик на DomainDataSource.GetData который возвращает IEnumerable коллекцию, которой в рантайме и будет биндится грид. Принцип работы компонента. В дизайнтайме создаётся датасет в который добавляется таблица. в эту таблицу добавляются поля, взятые рефлексией из нашего типа. 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=152]Компонент - помошник.[/CODEPOST]
Оценка: Проголосовало 2 посетителей, средняя оценка 4.50
Оценить:
  1 using System;
  2 using System.Data;
  3 using System.Collections;
  4 using System.ComponentModel;
  5 using System.Reflection;
  6 
  7 namespace Nik.Data.DomainDataSource
  8 {
  9 	/// <summary>
 10 	/// Делегат получателя данных, которые бинтдятся в run-time 
 11 	/// </summary>
 12 	public delegate IEnumerable IListHandler();
 13 
 14 	/// <summary>
 15 	/// Компонент - помошник, показывающий поля класса, коллекцией экземпляров которого биндится грид
 16 	/// </summary>
 17 	public class DomainDataSource : Component, IListSource, IEnumerable
 18 	{
 19 
 20 		string domainName;
 21 		string assemblyName;
 22 
 23 		
 24 		/// <summary>
 25 		/// Полное имя типа
 26 		/// </summary>
 27 		[Bindable(true)]
 28 		public string DomainName { get { return domainName; } set { domainName = value; } }
 29 		/// <summary>
 30 		/// Имя сборки, в которой находится класс, коллекцией экземпляров которого биндится грид
 31 		/// </summary>
 32 		[Bindable(true)]
 33 		public string AssemblyName { get { return assemblyName; } set { assemblyName = value; } }
 34 
 35 		/// <summary>
 36 		/// Событие, которое вызывается для того, что бы получить данные, которыми будет биндится грид в run-time 
 37 		/// </summary>
 38 		public event IListHandler GetEnumerableData;
 39 		
 40 		/// <summary>
 41 		/// Метод интерфейса IListSource, через него дизайнер получает экземпляр коллекции в design-time 
 42 		/// </summary>
 43 		public  IList GetList()
 44 		{
 45 				DomainSourceManager manager = new DomainSourceManager(DomainName,AssemblyName);
 46 				return manager.DesignStuff;
 47 		}
 48 		/// <summary>
 49 		/// Метод интерфейса IListSource
 50 		/// </summary>
 51 		public bool ContainsListCollection { get { return true; } }
 52 
 53 		/// <summary>
 54 		/// Метод интерфейса IEnumerable, через который получаем IEnumerator, который предоставляет данные для биндинга в run-time
 55 		/// </summary>
 56 		/// <returns></returns>
 57 		public IEnumerator GetEnumerator()
 58 		{
 59 			return GetEnumerableData().GetEnumerator();
 60 		}
 61 
 62 	}
 63 }
 64 
 65 
 66 	public class DomainSourceManager
 67 	{
 68 		Type domainObjectType;
 69 		private DataSet dataSet;
 70 		private  Assembly assembly;
 71 
 72 		public DomainSourceManager (string  domainName,string  assemblyName)
 73 		{
 74 			dataSet = new DataSet();
 75 			assembly= Assembly.Load(assemblyName);
 76 			domainObjectType =  assembly.GetType(domainName);
 77 			DataTable table = new DataTable(domainName);
 78 			foreach (PropertyInfo property in domainObjectType.GetProperties())
 79 			{
 80 				string name = property.Name;
 81 				if(table.Columns.Contains(name)) continue;
 82 				DataColumn column = table.Columns.Add(name,property.PropertyType);
 83 			}
 84 			dataSet.Tables.Add(table);
 85 		}
 86 
 87 		public IList DesignStuff
 88 		{
 89 			get
 90 			{
 91 				return dataSet.DefaultViewManager;
 92 			}
 93 		}
 94 	}
 95 
 96 
 97 // Использование 
 98 
 99 public class EmployeeList : Page
100 {
101 ...
102 this.domainDataSource1 = new advControls.DomainDataSource.DomainDataSource();
103 this.domainDataSource1.AssemblyName = "GZTData2, Culture=neutral, PublicKeyToken=null";
104 this.domainDataSource1.DomainName = "GZT.Domain.Employee";
105 ...
106 
107 private void Page_Load(object sender, EventArgs e)
108 {
109 domainDataSource1.GetEnumerableData+=new IListHandler(domainDataSource1_GetData);
110 }
111 
112 private void List_PreRender(object sender, EventArgs e)
113 {
114 dg.DataBind();
115 }
116 
117 private IEnumerable domainDataSource1_GetData()
118 {
119 return Registry.EmployeeMapper.SelectAll();
120 }
121 }
122 
Вернуться к списку исходников в категории DataGrid, DataList, Repeater
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта