|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
Компонент - помошник. |
|
Дата:
|
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 |
|
|
 |
 |
 |
 |
|
|