Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
ASP.NET Пользовательские Элементы Управления-Композиты
Резюме
Привет Всем,
OK, далее в мои приключения с пользовательскими элементами управления...
В общем, вот что я узнал о трех основных "classes" пользовательских элементах управления. Пожалуйста, не стесняйтесь поправлять меня, если что-то из этого неправильно!
- UserControls -которые наследуются от UserControl и содержатся в файле ASCX . Они довольно ограничены в том, что они могут сделать, но это быстрый и легкий способ получить некоторую общность UI с поддержкой дизайнера.
- Пользовательские составные элементы управления -это элементы управления, которые наследуются от WebControl , где вы добавляете ранее существующие элементы управления к элементу управления в методе CreateChildControls. Это обеспечивает большую гибкость, но отсутствие поддержки дизайнера без дополнительного кодирования. Они очень портативны, хотя, поскольку их можно скомпилировать в DLL.
- Пользовательские визуализированные элементы управления -подобно пользовательским составным элементам управления, они добавляются в проект Библиотеки веб-элементов управления. Рендеринг элемента управления полностью контролируется программистом путем переопределения метода рендеринга .
свои мысли..
OK, поэтому, играя с пользовательскими композитами, я обнаружил следующее:
- У вас мало/нет контроля над выходом HTML, что затрудняет "debug".
- CreateChildControls (и последующие методы) могут быть действительно заняты Controls.Add(myControl) везде.
- Я обнаружил, что таблицы рендеринга (будь то для макета или контента) значительно неудобны.
Вопрос(ы)..
Итак, я признаю, что я новичок в этом, поэтому я мог бы быть далеко от базы с некоторыми из моих пунктов, отмеченных выше..
- Вы используете композиты?
- Есть ли у вас какие-нибудь аккуратные трюки, чтобы контролировать выход HTML?
- Вы просто говорите "to hell with it" и идете дальше и создаете пользовательский визуализированный элемент управления?
Это то, что я очень хочу получить действительно твердым в своем уме, так как я знаю, насколько хорошее развитие контроля может сократить общее время разработки.
Я с нетерпением жду ваших ответов ^_^
Я говорю, что продолжайте с пользовательским визуализированным контролем. Я нахожу, что в большинстве случаев композит может быть проще сделать и использовать в UserControl, но что-нибудь сверх этого, и вам нужно будет иметь более тонкую степень контроля (каламбур непреднамеренный), чтобы заслужить свою собственную стратегию рендеринга.
Возможно, есть элементы управления, которые достаточно просты, чтобы заслужить композит (например, a textbox в сочетании с A javascript / dhtml на основе datepicker, например), но за пределами этого примера, похоже, что пользовательские визуализированные элементы управления-это путь.
Вот еще один метод расширения, который я использую для пользовательского рендеринга:
public static void WriteControls
(this HtmlTextWriter o, string format, params object[] args)
{
const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
var controls = new Dictionary<string,Control>();
for(int i =0; i < args.Length; ++i)
{
var c = args[i] as Control;
if (c==null) continue;
var guid = Guid.NewGuid().ToString();
controls[guid] = c;
args[i] = delimiter+guid+delimiter;
}
var _strings = string.Format(format, args)
.Split(new string[]{delimiter},
StringSplitOptions.None);
foreach(var s in _strings)
{
if (controls.ContainsKey(s))
controls[s].RenderControl(o);
else
o.Write(s);
}
}
Затем, чтобы отобразить пользовательский композит в методе RenderContents(), я пишу это:
protected override void RenderContents(HtmlTextWriter o)
{
o.WriteControls
(@"<table>
<tr>
<td>{0}</td>
<td>{1}</td>
</tr>
</table>"
,Text
,control1);
}
Роб, ты прав. Упомянутый мною подход является своего рода гибридом. Преимущество наличия файлов ascx заключается в том, что в каждом проекте, который я видел, дизайнеры будут чувствовать себя наиболее комфортно при редактировании actual markup, а с ascx вы и дизайнер можете работать отдельно. Если вы не планируете вносить фактические изменения CSS/markup/design в сами элементы управления позже, вы можете перейти к настраиваемому визуализированному элементу управления. Как я уже сказал, мой подход уместен только для более сложных сценариев (и это, вероятно, там, где вам нужен дизайнер :))
Я часто использую составные элементы управления. Вместо того, чтобы переопределить render или RenderContents, CssClass просто назначить каждому контролировать и использовать стили. Для нескольких Controls.Add я использую метод расширения:
//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
{ foreach(Control control in controls) coll.Add(control);
}
Для быстрого и грязного рендеринга я использую что-то вроде этого:
writer.Render(@"<table>
<tr><td>{0}</td></tr>
<tr>
<td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");
Для инициализации свойств элемента управления я использую синтаксис инициализатора свойств:
childControl = new Control { ID="Foo"
, CssClass="class1"
, CausesValidation=true;
};
Использование пользовательских составных элементов управления имеет смысл в ситуации, когда у вас есть большое веб-приложение и вы хотите повторно использовать большие куски во многих местах. Тогда вы только добавите дочерние элементы управления из тех, которые вы разрабатываете, а не повторяете сами. Недавно я работал над большим проектом и вот что мы сделали:
- Каждый составной элемент управления имеет контейнер. Используется в качестве обертки для всего, что находится внутри элемента управления.
- Каждый составной элемент управления имеет шаблон. Файл ascx (без директивы <%Control%>), который содержит только markup для шаблона.
- Контейнер (сам по себе являющийся элементом управления) инициализируется из шаблона.
- Контейнер предоставляет свойства для всех других элементов управления в шаблоне.
- Вы используете только this.Controls.Add([the_container]) в составном элементе управления.
На самом деле вам нужен базовый класс, который будет заботиться об инициализации контейнера с указанным шаблоном, а также создавать исключения, когда элемент управления не найден в шаблоне. Конечно, это, скорее всего, будет излишним в небольшом приложении. Если вы не используете повторно код и markup и хотите писать только простые элементы управления, вам лучше использовать пользовательские элементы управления.
Возможно, вы сможете использовать эту технику, чтобы упростить время разработки:
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx
В основном вы создаете экземпляр пользовательского элемента управления во время выполнения с помощью метода LoadControl, затем передаете ему какой-либо пакет состояния, а затем прикрепляете его к дереву элементов управления. Таким образом, ваш составной элемент управления будет фактически функционировать как больше контроллера, а файл .ascx будет похож на представление.
Это избавит вас от необходимости создавать экземпляры всего дерева элементов управления и стилизовать элемент управления в C#!