2017-01-22 9 views
0

Я застрял на странице ASP.DataBound ASP: события CheckBox не запускаются, как ожидалось, из-за DataBinding, возникающих на странице_Load()

Страница содержит ASP: Контейнер, содержащий несколько CheckBoxes. Мне нужно добавить событие в эти CheckBoxes OnCheckChange, поэтому всякий раз, когда мы нажимаем один из CheckBox, он отключает все остальные флажки. Я мог бы использовать RadioButton, но использование CheckBoxes имеет другие преимущества для меня, которые выходят из этой темы, поэтому я не хочу использовать радиокнопки.

Это было theorically нормально работать так же, как это:

<ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" /> 
     <br/> 
    </ItemTemplate> 

    </ASP:Repeater> 

и в коде позади:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 


    protected void MyCB_CheckedChanged(object sender, EventArgs e) 
    { 
     UncheckallOtherCheckBoxes(); 
    } 

Однако, есть и другие регионы этой страницы, чтобы работать, как и ожидалось, у меня есть для привязки DataSource при каждой загрузке страницы, а не только в первый раз. Так мне нужно изменить Page_Load к

protected void Page_Load(object sender, EventArgs e) 
    { 
    // if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 

И это вызывает все на провал! :) Потому что, когда я нажимаю на флажок, он запускает Page_Load перед MyCB_CheckedChanged(). Сначала это DataBinds, и поэтому привязка данных отправляет некоторые флажки, которые не являются событиями, выполняемыми пользователем.

Есть ли способ решить эту проблему?

Thx заранее.

+0

1. УВЕРЕНА, что вам нужно переустанавливать базу данных каждый раз, когда страница загружается? Это немного необычно - если вы хотите объяснить свои причины, это может помочь другим лучше понять. –

+0

@Sandy: Я думаю, потому что контейнер, упомянутый в позе, вложен в другой контейнер. Если я не перевязываю мастер-контейнер на PostBack, я заметил, что у всех дочерних контейнеров нет данных. –

ответ

0

Попробуйте привязать ваш источник данных позже на жизненном цикле страницы, если это возможно (onPreRender, например). Управляющие события для ваших флажков обрабатываются после PageLoad и до PreRender и некоторых других событий. См. https://msdn.microsoft.com/en-us/library/ms178472.aspx.

+0

Я должен был упомянуть, что Контейнер вложен в другой Контейнер. Это контейнер Отца, который нужно отскочить для флажков, которые будут отображаться в PostBack. Так же результат, если я перевешу свою привязку в PreRender: Если я не перепроверяю мой контейнер-контейнер, его источник данных сбрасывается, контейнеров для детей нет, поэтому метод MyCB_CheckedChanged не запускается. Если я свяжусь только с PostBack = false, при проверке коробки, перезагрузки страницы, контейнер-порт не восстанавливается и не имеет детей. Все флажки исчезают, и снова не запускается событие события MyCB_CheckedChanged ... –

+0

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

+0

Также было бы неплохо, если бы вы разместили небольшой пример исходного кода, чтобы проиллюстрировать проблему. Это полезно для остальных из нас, чтобы лучше понять, что вы делаете. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^