Как сделать возможным User/CustomControl'у содержать другие?
От: Saruwatari Россия  
Дата: 07.08.08 00:19
Оценка:
Как написанному мной контролу (User или Custom) добавить возможность содержать другие контролы, которые описываются вложением тегов друг в друга? Т.е. чтобы можно было писать примерно так:
<uc1:MyBox ID="MyUserControl1" Value="1">
     <div>DIV 1</div>
     <div>DIV 1</div>
</uc1:MyBox>

<uc1:MyBox ID="MyUserControl1" Value="1">
     <uc1:MyItem ID="MyItem1" Value="True" />
</uc1:MyBox>

<uc1:MyBox ID="MyUserControl3" Value="3" />
Re: Как сделать возможным User/CustomControl'у содержать дру
От: Овощ http://www.google.com
Дата: 07.08.08 07:02
Оценка: 4 (2)
Здравствуйте, Saruwatari.

Такое можно сделать с помощью следующего атрибута, примененного к классу контрола-контейнера:
[ParseChildren(ChildrenAsProperties=false)]
Re[2]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 09.08.08 16:18
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Saruwatari.


О>Такое можно сделать с помощью следующего атрибута, примененного к классу контрола-контейнера:

О>
О>[ParseChildren(ChildrenAsProperties=false)]
О>


А как атрибут можно установить для класса контрола, если есть только один файл ASCX? Т.е. у меня, например, есть только один простой ASCX:
<%@ Control Language="C#" ClassName="MyControl" %>
<table>
   <tr>
      <td>
         Text
      </td>
   </tr>
</table>

Как мне в таком случае назначить классу MyControl атрибут?
Re[3]: Как сделать возможным User/CustomControl'у содержать
От: Овощ http://www.google.com
Дата: 11.08.08 06:16
Оценка: 2 (1)
Здравствуйте, Saruwatari.

Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate).
Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.
Re[4]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 11.08.08 10:07
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Saruwatari.


О>Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate).

О>Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.

Эту ссылку я как раз изучаю )

Последний вопрос был связан с тем, как с помощью инлайн скриптов добавить аттрибут классу... Я еще спросил здесь, но пока без результата...
Re[4]: Как сделать возможным User/CustomControl'у содержать
От: mogadanez Чехия  
Дата: 25.08.08 14:15
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Saruwatari.


О>Не совсем понятно, чего нужно добиться в итоге. Возможно все стоит сделать более гибким способом — создавать новый ascx-контрол с использованием шаблонов (templates, ITemplate).

О>Вот здесь есть пример (правда немножко кривенький): How to: Create Templated ASP.NET User Controls.

пример чуть поровнее:
http://www.rsdn.ru/Forum/message/1111792.1.aspx
Автор: mogadanez
Дата: 07.04.05
Re[4]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 31.08.08 06:23
Оценка:
Здравствуйте, Овощ.

У меня появилась следующая проблема...
Подход с ITemplate я использую для того, чтобы создать единый фрейм для всех форм ввода пользователем данных. Таким образом, я могу описывать разный контент для моего одного фрейма, примерно так:

<kc:CustomDialogForm ID="CustomDialogForm1" runat="server">
    <Content>
        <table>
            <tr>
                <td>
                    <asp:TextBox ID="txtName" runat="server" />
                </td>
            </tr>
        </table>
    </Content>
</kc:CustomDialogForm>

Но появилась проболема, и я не уверен что она имеет решения в рамках применяемого мной подхода. Я хочу иметь доступ к элементу txtName (если смотреть мой пример) на стороне сервера после того, как пользователь отправит данные. Но контрол с именем txtName вообще не определен, если он помещен внутри тэга <Content> и, следовательно, у меня нет такой возможности.
Данная пробоема имеет ли решение?
Если нет, то какой еще подход можно использовать, чтобы создать единый фрейм для диалоговых окон?

PS: Диалоговые окна создаются с помощью абсолютного позиционирования DIV'ов.
Re[5]: Как сделать возможным User/CustomControl'у содержать
От: Овощ http://www.google.com
Дата: 01.09.08 06:55
Оценка:
Здравствуйте, Saruwatari, Вы писали:

S>Подход с ITemplate я использую для того, чтобы создать единый фрейм для всех форм ввода пользователем данных. Таким образом, я могу описывать разный контент для моего одного фрейма, примерно так:


S>Но появилась проболема, и я не уверен что она имеет решения в рамках применяемого мной подхода. Я хочу иметь доступ к элементу txtName (если смотреть мой пример) на стороне сервера после того, как пользователь отправит данные. Но контрол с именем txtName вообще не определен, если он помещен внутри тэга <Content> и, следовательно, у меня нет такой возможности.

S>Данная пробоема имеет ли решение?
S>Если нет, то какой еще подход можно использовать, чтобы создать единый фрейм для диалоговых окон?

S>PS: Диалоговые окна создаются с помощью абсолютного позиционирования DIV'ов.


Если не ошибаюсь, то за это отвечает атрибут [TemplateInstance(TemplateInstance.Single)], которым помечают ITemplate-свойство (в общем берем рефлектор и смотрим как сделано UpdatePanel.ContentTemplate). + не забываем инстанцировать шаблон на этапе PageInit.
Re[6]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 01.09.08 07:24
Оценка:
Здравствуйте, Овощ, Вы писали:

О>(в общем берем рефлектор и смотрим как сделано UpdatePanel.ContentTemplate).


Не нашел
Re[6]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 01.09.08 08:26
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Если не ошибаюсь, то за это отвечает атрибут [TemplateInstance(TemplateInstance.Single)], которым помечают ITemplate-свойство


Не получилось.
Re[7]: Как сделать возможным User/CustomControl'у содержать
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.08 08:34
Оценка:
Здравствуйте, Saruwatari, Вы писали:
О>>(в общем берем рефлектор и смотрим как сделано UpdatePanel.ContentTemplate).

S>Не нашел

А где искал?
[PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single), Browsable(false)]
public ITemplate ContentTemplate
{
    get
    {
        return this._contentTemplate;
    }
    set
    {
        if (!base.DesignMode && (this._contentTemplate != null))
        {
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, AtlasWeb.UpdatePanel_CannotSetContentTemplate, new object[] { this.ID }));
        }
        this._contentTemplate = value;
        if (this._contentTemplate != null)
        {
            this.CreateContents();
        }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 01.09.08 08:41
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>Не нашел

S>А где искал?

Я не нашел вообще DLL, которую смотреть. Смотрел в GAC'е и просто искал... Может проглядел?
Re[9]: Как сделать возможным User/CustomControl'у содержать
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.08 09:08
Оценка:
Здравствуйте, Saruwatari, Вы писали:
S>Я не нашел вообще DLL, которую смотреть. Смотрел в GAC'е и просто искал... Может проглядел?

Assembly: System.Web.Extensions, Version=3.5.0.0
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 01.09.08 21:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Saruwatari, Вы писали:

S>>Я не нашел вообще DLL, которую смотреть. Смотрел в GAC'е и просто искал... Может проглядел?

S>Assembly: System.Web.Extensions, Version=3.5.0.0


Каким вы рефлектором смотрите? Я использую тот, что здесь
Не могу им открыть ассембл из GAC.
Re[11]: Как сделать возможным User/CustomControl'у содержать
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.08 02:05
Оценка:
Здравствуйте, Saruwatari, Вы писали:

S>Каким вы рефлектором смотрите?

Тем же самым.
S>Я использую тот, что здесь
S>Не могу им открыть ассембл из GAC.
Вот это непонятно. Что происходит при File->Open Cache?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 02.09.08 04:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Saruwatari, Вы писали:


S>>Каким вы рефлектором смотрите?

S>Тем же самым.
S>>Я использую тот, что здесь
S>>Не могу им открыть ассембл из GAC.
S>Вот это непонятно. Что происходит при File->Open Cache?

При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается.
Может у меня криво как-то встало? )
На рисунке то, что я вижу:
Re[13]: Как сделать возможным User/CustomControl'у содержать
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.08 05:27
Оценка:
Здравствуйте, Saruwatari, Вы писали:

S>При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается.

S>Может у меня криво как-то встало? )
S>На рисунке то, что я вижу:
Нужно давить Refresh в левом окне. У меня тоже не сразу всё появилось.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Как сделать возможным User/CustomControl'у содержать
От: Овощ http://www.google.com
Дата: 02.09.08 06:05
Оценка: 92 (4)
Здравствуйте, Saruwatari, Вы писали:

S>Не получилось.


А у меня получилось. Лови работающий пример.

TemplatedUserControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TemplatedUserControl.ascx.cs" Inherits="TemplatedUserControl" %>
<div style="border: solid 1px black; background-color: yellow">
    <asp:PlaceHolder ID="contentTemplateContainer" runat="server"></asp:PlaceHolder>
</div>


TemplatedUserControl.ascx.cs
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; }
    }
}


Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Src="~/TemplatedUserControl.ascx" TagName="TemplatedControl" TagPrefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <uc:TemplatedControl ID="uc1" runat="server">
                <ContentTemplate>
                    <asp:Button ID="Button1" Text="Пыщь1" OnClick="Button1_Click" runat="server" />
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                </ContentTemplate>
            </uc:TemplatedControl>
            <br />
            <uc:TemplatedControl ID="uc2" runat="server">
                <ContentTemplate>
                    <asp:Button ID="Button2" Text="Пыщь2" OnClick="Button2_Click" runat="server" />
                    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                </ContentTemplate>
            </uc:TemplatedControl>
        </div>
    </form>
</body>
</html>


Default.aspx.cs
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'у содержать
От: mogadanez Чехия  
Дата: 02.09.08 07:56
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Saruwatari, Вы писали:


S>>Не получилось.


О>А у меня получилось. Лови работающий пример.


хочу добавить, такое можно делать если разрабатывается независимый, переиспользуемый компонент, если это контрол локального внутреннего пользования, то лучше обращаться к содержимому контейнера через сам контейнер. код будет более понятный, и будет меньше ошибок

TextBox1.Text += "!";
=>
uc1.TitleBox += "!";
Re[14]: Как сделать возможным User/CustomControl'у содержать
От: Saruwatari Россия  
Дата: 02.09.08 09:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Saruwatari, Вы писали:


S>>При этом ее вообще нет. Ее видно, если использовать обычное открытие ассембли, но открыть собственно ее не получается.

S>>Может у меня криво как-то встало? )
S>>На рисунке то, что я вижу:
S>Нужно давить Refresh в левом окне. У меня тоже не сразу всё появилось.

Блин, давил 100 раз... Не появилось
Может, действительно криво стоит? Как-то можно проверить это?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.