Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CompositeControl и Generic, можно ли... ? 
:(
    Опции темы
StepS
  Дата 22.5.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



Всем привет, возник вопрос, явного ответа найти не смог.

есть контрол:
Код

public calss MyControl<T> : CompositeControl{
   private List<T> dataSource;
   
   public List<T> MyDataSource {
      get {return dataSource;}
      set {dataSource = value; }
   }
}


как такой контрол можно разместить на странице aspx ? как задать используемый тип T ?
т.е. что-то типа:

Код

<ctl.MyControl ID="myControl" runat="server".../>

PM MAIL ICQ   Вверх
Mymik
Дата 22.5.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(StepS @  22.5.2007,  14:45 Найти цитируемый пост)
как задать используемый тип T ?

задается через where
Код

public calss MyControl<T> : CompositeControl 
    where T : class, new()


Цитата(StepS @  22.5.2007,  14:45 Найти цитируемый пост)
как такой контрол можно разместить на странице aspx ?

В каком смысле ??? ты хочешь чтобы это был как отдельный контрол ??? тогда переопределяй Render метод и(или) OnPreRender. Там ты и будешь создавать свой контрол.
После чего ты в файле твоего aspx прописываешь 
Код

<%@ Register TagPrefix="<Префикс>" 
    Namespace="<Пространство имен>" 
    Assembly="<Без комментариев>" %>

B непосредственно на страницы вызываешь 
Код

<[Префикс]:[Имя класса] runat="server" />

Ну и передаваемые параметры если ему там это нужно все.


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
StepS
Дата 22.5.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



сорри, может я не правильно выразился.. вопрос "как задать используемый тип T?" был к тому как указать этот тип на странице при использованиии самого контрола. Например тот контрол, кот я привел выше, нужно разместить на страницу (aspx). 
Как это сделать, т.е. использовать generic контрол на странице ? сорри за тавтологию

P.S. Как делать register и т.д. я в курсе. 
PM MAIL ICQ   Вверх
SpaceSpace
Дата 23.5.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



StepS
жесть smile 

давай вместе подумаем, только если додумаемся - не забуть поделиться - тоже юзать буду!!!

Мысли следующие:
1. делать контрол-оболочку у котрого есть паблик свойство,
куда из ascx передаешь тот объект, который generic T
Код

<a:и ID="primer" runat="server" publicProperty=<%#GetType("TypeName")%>  />

2. Этот контрол - оболочка динамически генерит и запихивает в себя нужный контрол
для этой цели я думаю подойдет 
Код

Activator.CreateInstance( Type)


Ну это то, что сразу всплыло, а так тема далеко не тривиальная
Сам как считаешь?
Дальше будем думать?


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
StepS
Дата 23.5.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



ок. Давай думать.
Твой вариант нужно попробовать. 

Есть такой вариант:

Если нужет тип Int делаем контрол:
Код

public class IntMyControl : MyControl<Int> {
  //здесь ничего не делаем.
}


на странице этот контрол уже можно использовать.

Код

<ctl:IntMyControl.../>


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


Это сообщение отредактировал(а) StepS - 23.5.2007, 11:22
PM MAIL ICQ   Вверх
SpaceSpace
Дата 24.5.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



hI ALL 
вот наклюнулось решение,
продолжение моей мысли, высказанной ранее

Вот у нас есть класс-оболочка
Код

  public partial class ShellControl : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           // смотрим че за тип, создаем тип
            if (_type == typeof(Int32))
            {
                GenericControl<Int32> g = new GenericControl<Int32>();
                // 
                this.Controls.Add(g);
            }
        }
        Type _type;
        // пресловутое свойство, куда кладем необходимый тип
        public Type SetType
        {
            set 
            {
                _type = value;
            }
        }
    }


Ну а asp пишем в свойство тип, и... оп-ля
Вот у нас есть generic контрол
Код

    public partial class GenericControl<T> : System.Web.UI.UserControl 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            object newObj = null;
            // создаем инстанс неизвестгого типа
            newObj = Activator.CreateInstance<T>();
           // чето делаем с ним
            if (newObj is Int32)
                newObj = 1000000;
            Label l = new Label();
            //для наглядности выводим результат
            l.Text = newObj.ToString();
            this.Controls.Add(l);
        }
    }


Сразу оговорюяь, что написал криво, 
просто показываю РЕАЛИЗУЕМОСТЬ данного подхода

Предлагаю всем сочувствубщим присоединяться и изложить свои соображения по качеству и оптимизации кода
в частности это касается унификации использования типов, и зоздания их инстансов


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Mymik
Дата 24.5.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



А можно задать вопрос........ а где это можно использовать ??? В своей не столь длинном сроке работы в asp.net сфере я только один раз создал контрол, который в зависимости от передаваемого в него значение изменял свой вид... И это было только лишь bool значение.
Вы же, как я понимаю, хотите засунуть весь сайт в один контрол, так ???  Типа при одном значении отображать один контрол, при другом второй контрол... ну и так далее. 
Мне просто хочется понять где такой хитрый трюк можно вообще использовать...

Добавлено через 1 минуту и 44 секунды
А чем вам не нравится PlaceHolder ???


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
SpaceSpace
Дата 24.5.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



Mymik

В данном случае, не ведется разговор о манипуляции представлениями,
а как отмечал StepS,
Код

  private List<T> dataSource;
   
   public List<T> MyDataSource {
      get {return dataSource;}
      set {dataSource = value; }

речь о манипуляции данными.

хотя... smile 
можно манипулировать и представлениями.
Я об этом писал в топике Динамическое создание сложных(составных) контролов
идею, к сожалению не поддержали... smile 
жесть,
Mymik
молодец smile 


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Mymik
Дата 24.5.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(SpaceSpace @  24.5.2007,  10:20 Найти цитируемый пост)
В данном случае, не ведется разговор о манипуляции представлениями,

я в этой жизни чего не понимаю  smile . Всегда думал, что данные являются основой представления... Т.е. нет данных нет и представление... а точнее сгенерированного выходного кода... А если есть данные, то они и меняют представление... Ну и в зависимости от данных пришедших к ним, у тебя и есть разные представления.
Я как обычно, банально, не понимаю где это можно применить и как это можно применить...


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
SpaceSpace
Дата 24.5.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



Mymik, если меня поймеш - ставь мне плюс, не поймеш - ставь минус.

НАПРИМЕР
P.S. хотя правильней было бы спросить того, кто начал тему, а мне щас минус влепят ни за что smile 

У тебя есть 3 модели(класса), все они храняться деревом
Пусть это будут: 
подразделения предприятия(явно дерево)
Иерархия сотрудников(кто под кем, тоже дерево),
ну и .... категории технологий(типа в .NET есть С# и CLR и т.д...)

Воот. тебе нужно вывести их на экран деревом.
Методы для вывода деревом,Обработка узлов... и т.д. у тебя написаны ОДИН раз, они generic

Например у тебя есть Page , который сын MasterPage,в котром есть ContentPlaceHolder,

ты предлагаешь юзать то, что нам дают свыше, от всемогущего мелкософта,
Как минимум, придется создать 3 Page'а, для каждого типа деревьев, ну +3 контрола естественно
Что в этом плохого, я знаю, что ты спросишь. НИЧЕГО!!!.
Привык делать так, потому что быстро? удобно?
Я с тобой согласен!!! Я сам так делаю.

НО. Ведь можно что-то изменить, усовершенствовать.
Мне кажется, я в этом уверен. Что шаблонами надо пользоваться. Желательно везде.

Что я опять не так сказал?



--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
StepS
  Дата 24.5.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



SpaceSpace пример привел, хороший. Т.е. идея в том, чтобы сделать контрол, который работает с раным типом данных, например:
List<int>, List<MyClass>, List<YourClass> и т.д. Если делать без generic нужно ставить много проверок на типы вроде:

Код

if(MyDataSource is Int){
....
} else if (MyDataSource is MyClass){
...
}


при таком подходе, если появляется новый тип данных - нужно залезать в контрол и дописывать еще один if. т.е. на лицо преимущество generic-ов.

Это сообщение отредактировал(а) StepS - 24.5.2007, 12:15
PM MAIL ICQ   Вверх
Mymik
Дата 24.5.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



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

Ну а если по теме... для этого существует мощный ADO.NET. В частности DataSet и INamingContainer... передали tamplate и не паримся... 
Всегда можно найти другой путь ;о)  smile . Я все же ленивый и мне было б лень описывать структуры или классы для этих объектов, я б лучше засунул все это в DataSet и радовался жизни :о)


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
SpaceSpace
Дата 25.5.2007, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 3
Всего: 10



Mymik

 
Цитата

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


Я же всеми силами пытаюсь распространить свою идею! 
просто у меня в отделе полно таких же как ты, ленивых, но шибко рациональных smile 

Я по мере сил, пытаюсь.

Изложу все на бумаге, аргументирую, потом посмотрим...
Все новое и непривычное обычно встречается жуткой критикой и непониманием  smile 

2StepS
Так что насчет реализации?
Как ты решил делать? Обещал поделиться


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
StepS
Дата 25.5.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 26.8.2005
Где: Днепропетровск

Репутация: нет
Всего: нет



2Mymik 
Дело все в том (от куда возник данный вопрос), что в данном случае идет оптимизация (рефакторинг) уже существующего проекта и все эти структуры List<...> уже написаны. То что нужно использовать DataSet -ы это я согласен, но пределака на DataSet-ы сильно дорогА для проекта. Вот и возникла мысль написать generic smile Дешево и сердито

2SpaceSpace
В моем случае, я уже написал обертки для каждого контрола и их использую (т.е. мой подход), но если мне встретиться еще такая задача, та я скорее всего пойду по твоему пути, чтобы не множить классы. Было бы время и деньги переписал бы... но за неимением сего, сильно шиковать не приходиться.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.