Как написанному мной контролу (User или Custom) добавить возможность содержать другие контролы, которые описываются вложением тегов друг в друга? Т.е. чтобы можно было писать примерно так:
Здравствуйте, Овощ, Вы писали:
О>Здравствуйте, Saruwatari.
О>Такое можно сделать с помощью следующего атрибута, примененного к классу контрола-контейнера: О>
О>[ParseChildren(ChildrenAsProperties=false)]
О>
А как атрибут можно установить для класса контрола, если есть только один файл ASCX? Т.е. у меня, например, есть только один простой ASCX:
<%@ Control Language="C#" ClassName="MyControl" %>
<table>
<tr>
<td>
Text
</td>
</tr>
</table>
Как мне в таком случае назначить классу MyControl атрибут?
Re[3]: Как сделать возможным User/CustomControl'у содержать
Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate).
Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.
Re[4]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Овощ, Вы писали:
О>Здравствуйте, Saruwatari.
О>Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate). О>Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.
Эту ссылку я как раз изучаю )
Последний вопрос был связан с тем, как с помощью инлайн скриптов добавить аттрибут классу... Я еще спросил здесь, но пока без результата...
Re[4]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Овощ, Вы писали:
О>Здравствуйте, Saruwatari.
О>Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate). О>Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.
У меня появилась следующая проблема...
Подход с ITemplate я использую для того, чтобы создать единый фрейм для всех форм ввода пользователем данных. Таким образом, я могу описывать разный контент для моего одного фрейма, примерно так:
Но появилась проболема, и я не уверен что она имеет решения в рамках применяемого мной подхода. Я хочу иметь доступ к элементу txtName (если смотреть мой пример) на стороне сервера после того, как пользователь отправит данные. Но контрол с именем txtName вообще не определен, если он помещен внутри тэга <Content> и, следовательно, у меня нет такой возможности.
Данная пробоема имеет ли решение?
Если нет, то какой еще подход можно использовать, чтобы создать единый фрейм для диалоговых окон?
PS: Диалоговые окна создаются с помощью абсолютного позиционирования DIV'ов.
Re[5]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Saruwatari, Вы писали:
S>Подход с ITemplate я использую для того, чтобы создать единый фрейм для всех форм ввода пользователем данных. Таким образом, я могу описывать разный контент для моего одного фрейма, примерно так:
S>Но появилась проболема, и я не уверен что она имеет решения в рамках применяемого мной подхода. Я хочу иметь доступ к элементу txtName (если смотреть мой пример) на стороне сервера после того, как пользователь отправит данные. Но контрол с именем txtName вообще не определен, если он помещен внутри тэга <Content> и, следовательно, у меня нет такой возможности. S>Данная пробоема имеет ли решение? S>Если нет, то какой еще подход можно использовать, чтобы создать единый фрейм для диалоговых окон?
S>PS: Диалоговые окна создаются с помощью абсолютного позиционирования DIV'ов.
Если не ошибаюсь, то за это отвечает атрибут [TemplateInstance(TemplateInstance.Single)], которым помечают ITemplate-свойство (в общем берем рефлектор и смотрим как сделано UpdatePanel.ContentTemplate). + не забываем инстанцировать шаблон на этапе PageInit.
Re[6]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Овощ, Вы писали:
О>Если не ошибаюсь, то за это отвечает атрибут [TemplateInstance(TemplateInstance.Single)], которым помечают ITemplate-свойство
Не получилось.
Re[7]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Saruwatari, Вы писали: S>>Я не нашел вообще DLL, которую смотреть. Смотрел в GAC'е и просто искал... Может проглядел?
S>Assembly: System.Web.Extensions, Version=3.5.0.0
Каким вы рефлектором смотрите? Я использую тот, что здесь
Не могу им открыть ассембл из GAC.
Re[11]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Saruwatari, Вы писали:
S>Каким вы рефлектором смотрите?
Тем же самым. S>Я использую тот, что здесь S>Не могу им открыть ассембл из GAC.
Вот это непонятно. Что происходит при File->Open Cache?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Saruwatari, Вы писали:
S>>Каким вы рефлектором смотрите? S>Тем же самым. S>>Я использую тот, что здесь S>>Не могу им открыть ассембл из GAC. S>Вот это непонятно. Что происходит при File->Open Cache?
При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается.
Может у меня криво как-то встало? )
На рисунке то, что я вижу:
Re[13]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Saruwatari, Вы писали:
S>При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается. S>Может у меня криво как-то встало? ) S>На рисунке то, что я вижу:
Нужно давить Refresh в левом окне. У меня тоже не сразу всё появилось.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Как сделать возможным User/CustomControl'у содержать
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
[ParseChildren(true)]
[PersistChildren(false)]
public partial class TemplatedUserControl : System.Web.UI.UserControl
{
ITemplate _contentTemplate;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// не забываем инстанцировать шаблон во время init
CreateContent();
}
private void CreateContent()
{
if (this._contentTemplate != null)
{
contentTemplateContainer.Controls.Clear();
this._contentTemplate.InstantiateIn(this.contentTemplateContainer);
}
}
// ключевые атрибуты этой техники
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate ContentTemplate
{
get { return this._contentTemplate; }
set { this._contentTemplate = value; }
}
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
// как видим несмотря на то, что обе кнопки и оба текстбокса
// находятся внутри шаблонов, тем не менее мы можем свободно обращаться
// к ним из кода основной страницыprotected void Button1_Click(object sender, EventArgs e)
{
TextBox1.Text += "!";
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox2.Text += "?";
}
}
Re[8]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Овощ, Вы писали:
О>Здравствуйте, Saruwatari, Вы писали:
S>>Не получилось.
О>А у меня получилось. Лови работающий пример.
хочу добавить, такое можно делать если разрабатывается независимый, переиспользуемый компонент, если это контрол локального внутреннего пользования, то лучше обращаться к содержимому контейнера через сам контейнер. код будет более понятный, и будет меньше ошибок
TextBox1.Text += "!";
=>
uc1.TitleBox += "!";
Re[14]: Как сделать возможным User/CustomControl'у содержать
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Saruwatari, Вы писали:
S>>При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается. S>>Может у меня криво как-то встало? ) S>>На рисунке то, что я вижу: S>Нужно давить Refresh в левом окне. У меня тоже не сразу всё появилось.
Блин, давил 100 раз... Не появилось
Может, действительно криво стоит? Как-то можно проверить это?