Вызов серверной функции после постбэка

Eten
Дата: 23.04.2010 16:14:08
Доброго времени суток )

Возник вопрос. Есть юзер контрол. При вызове в контроле на стороне клиента функции __doPostBack('myControl','') необходимо вызывать соответствующую серверную обработку (после PageLoad). Пытался понять как это реализовано в стандартных контролах, например в чекбоксе на клиенте при клике вызывается:

<input id="CheckBox1" type="checkbox" name="CheckBox1" onclick="javascript:setTimeout('__doPostBack(\'CheckBox1\',\'\')', 0)" />

А на сервере после PageLoad вызывается обработчик

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{

}

1) Знающие люди, разъясните каким образом происходит вызов CheckBox1_CheckedChanged,
ведь в параметрах __doPostBack нет указания на этот метод?

2) Почему для каждого контрола возможно только одно серверное событие, т.е. для Button - Click, для TextBox - TextChanged, для CheckBox - CheckedChanged и т.д. Как поступить, если на один контрол мне необходимо подвесить два или более серверных события?

ЗЫ: ссылки на примеры и статьи очень приветствуются ))
Gennadiy83
Дата: 23.04.2010 16:48:26
В __doPostBack() необходимо указывать не name контрола, а ID. Например:
var checkBoxID = "<%= CheckBox1.ClientID %>";
В __doPostBack указать checkBoxID. В браузере просмотрите код страницы, найдите строку с вашим __doPostBack-ом и увидите, что он туда подставляет (совсем не имя).

Второй вариант вызова серверных событий (немного идиотский, но работает всегда):
1. на форме делаем невидимую кнопку
var actionBtn = "<%= ActionButton.ClientID %>";
2. определяем для кнопки серверное событие Click()
3. для CheckBox-а определяем клиентское событие в обработчике которого пишем
document.getElementById(actionBtn).click()
Всё, вызывается серверное событие кнопки ActionButton.
Попробуйте, надеюсь поможет.
Eten
Дата: 23.04.2010 16:53:17
Геннадий, спасибо ))
Я был уверен что во всемогущем ASP.NET есть более изящное решение!
Eten
Дата: 23.04.2010 16:54:45
и все-таки почему происходит вызов CheckedChanged и у контролов только одно серверное событие?
Mere Mortal
Дата: 23.04.2010 16:59:33
Что значит одно событие? Сколько угодно назначьте.
Eten
Дата: 23.04.2010 17:06:11
Каким образом? Ждя каждого события по кнопке или линк баттону? А как быть если необходимо передать в аргументах какие-либо данные?
Zoria
Дата: 23.04.2010 17:15:19
Eten
Каким образом? Ждя каждого события по кнопке или линк баттону? А как быть если необходимо передать в аргументах какие-либо данные?

getpostbackeventreference
Gennadiy83
Дата: 23.04.2010 17:22:59
У меня не было ситуаций, когда одному элементу приходилось определять несколько событий, но я полагаю, что нам ничего не мешает определить несколько из доступных для контрола (onchange="Function1" onfocus="Function2").

Параметры в обработчики передавать нельзя (никогда не задумывался, но нигде не встречал). В обработчике можно вызвать функцию с параметром и всё.
Zoria
Дата: 23.04.2010 18:16:13
Gennadiy83

Параметры в обработчики передавать нельзя (никогда не задумывался, но нигде не встречал)

так "не встречал" или "нельзя"?
Gennadiy83
Дата: 26.04.2010 08:50:36
Zoria
Gennadiy83

Параметры в обработчики передавать нельзя (никогда не задумывался, но нигде не встречал)

так "не встречал" или "нельзя"?


Эксперимент показал, если добавить параметр, то событие не отрабатывает. У меня вопрос: если определить событие onclick=RunBtn(), то как в функцию RunBtn() передать значение какой-либо переменной? По-моему, это в принципе не возможно. В эксперименте я подставил число - RunBtn(3), и это не отработало. Если у Вас другое мнение, поделитесь. Буду рад узнать для себя новое.