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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие не срабатывает, Cобытие ImageButtona - Click не работает 
:(
    Опции темы
Nicopol2
  Дата 13.7.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Может ли кто нибудь мне объяснить почему когда создаешь контрол не в конструкторе класса - событие не срабатывает  smile :
Код

namespace test
{
public class Class1 : Control
{
ImageButton im;
public Class1()
{
}
protected override void CreateChildControls()
{
im = new ImageButton();
Controls.Add(im);
im.ID = "imageBut1";
im.Click += new ImageClickEventHandler(im_Click);
}
void im_Click(object sender, ImageClickEventArgs e)
{
// это событие не срабатывает
}
}
}

- (Class1 - генерируемыу контрол)
а если поместить этот код в конструктор:

Код

public class1()
{
im = new ImageButton();
Controls.Add(im);
im.ID = "imageBut1";
im.Click += new ImageClickEventHandler(im_Click);
} 


- все отлично работает. В чем дело???????????????????????
Но создавать контрол в конструкторе - это слишком рановато! 
PM MAIL   Вверх
Mymik
Дата 14.7.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Nicopol2, когда приходит событие обратно, то страница генерируется по новой и динамические контролы на подобии твоего не хранятся в структуре данной страницы. И потому все они собираются по новой. И наверняка ты не вызываешь создание всех этих контролов если IsPostBack == true. 


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

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


Опытный
**


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

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



Да.
Довольно распространенная ошибка с динамическим созданием контролов или ,например, привязкой данных.
Дело в том (повторяю слова Mymik), что серверный код отрабатывает каждый раз при обращении к нему, поэтому он (код, серверный объект) должен быть в курсе первый или непревый раз к небу обращается один и тот же пользователь. Для этого предусмотрено свойство IsPostBack,
которым ты как раз должен проверить эту ситуацию.
Получается следующее. 

Первый запуск страницы: 
обращение к серверу, запрос серверной страницы.
в каком-либо методе у тебя генерятся динамические контролы.
страница в HTML(рендериться) приходит к клиенту
Ты кликаеш на кнопку. 
Сам факт кликания сохранияется в скрытом поле и отправляется на сервер

Вот тут логично должно обработаться событие, но..
происходит следующее :
серверный объект думает что это не второе, а первое обращение к странице и
заново создает контрол, соответсвенно кликнул ты или не кликнул - ему всё-равно.

а вот если бы ты учитывал сей факт, то всё бы хорошо работало


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


Эксперт
****


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

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



Цитата(SpaceSpace @  16.7.2007,  07:26 Найти цитируемый пост)
Ты кликаеш на кнопку. 
Сам факт кликания сохранияется в скрытом поле и отправляется на сервер

Нет никакого скрытого поля. Все серверные события генерируются за счет Post-данным (или Get), отправляемых при submit'e (при содействии ViewState).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 16.7.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Nicopol2, этот вопрос уже обсуждался посмотри здесь
ну а если вкратце, то:
- ты делаешь правильно, нужно переопределять CreateChildControls(). Но ведь его нужно где-то и вызывать, правда? А где ты его вызываешь? Нигде. Надеешься, что базовый класс Control сам вызовет? Нет, не вызовет. 
Нужно еще задействовать метод EnsureChildControls() и свойство ChildControlsCreated. Свойство ChildControlsCreated говорит о том, созданы ли дочерние контролы или нет, а метод EnsureChildControls() просто проверяет это свойство и если дочерние контролы не созданы - вызывает как раз твой метод CreateChildControls().

Цитата

 создавать контрол в конструкторе - это слишком рановато!

Поставь в конструкторе 
Код

ChildControlsCreated = false;

а там, где тебе это нужно (обычно - в свойствах контрола или в OnLoad контрола) - вызов EnsureChildControls().

Ну и, конечно, переделай сам CreateChildControls()
Код

protected override void CreateChildControls()    
{    
im = new ImageButton();    
Controls.Add(im);    
im.ID = "imageBut1";    
im.Click += new ImageClickEventHandler(im_Click);    
ChildControlsCreated = true;   //это важно
}

должно работать... Если ты не забудешь вызвать EnsureChildControls(), конечно smile

Ну все, теперь можно и в отпуск.... 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

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

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

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


 




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


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

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