2013-05-29 4 views
-1

У меня есть пользовательский элемент управления на странице aspx, который содержит поля фильтра и возвращает WhereClause. Пользовательский консоль поднимет событие под названием FilterApplied, когда нажата кнопка «Поиск».Запуск загрузки страницы несколько раз

На моей главной форме я добавить элемент управления с:

<uc1:Filter runat="server" ID="Filter" /> 
<br /> 

В моем коде позади меня:

protected void Page_Load(object sender, EventArgs e) 
    { 
     //Register event when filter is changed. 
     this.Filter.FilterApplied += new EventHandler(this.FilterApplied); 

     if (Page.IsPostBack) 
     { //Do some things that take long 
     } 
    } 

    protected void FilterApplied(object sender, EventArgs e) 
    { 
     //Reload the page to refresh the graphs. 
     Page_Load(sender, e); 
    } 

Проблема: Когда я нажимаю Поиск по моему пользовательский элемент управления, Form_Load выполняется дважды. Один раз, потому что он перезагружен, а затем еще раз, потому что я вызываю его из FilterApplied. Если я не назову его из FilterApplied, то whereclause все равно пуст.

Как я могу гарантировать, что Page_Load запускается только один раз при нажатии на Поиск?

+0

Тогда не называют 'Page_Load' из вашего' метода FilterApplied'. –

+0

Не работает. «Если я не назову его из FilterApplied, то whereclause все равно пуст». –

+0

Почему вопрос непонятен или не полезен (или показать отсутствие исследований? Если неясно, могу ли я попробовать и исправить его. –

ответ

1

Ваша проблема заключается в многократной регистрации для события FilterApplied. Каждый раз, когда вы вызываете метод Page_Load, вы снова подписываетесь на это событие. Вот очень простой пример того, что вы делаете, написанный в WinForms с помощью одной кнопки на форме, просто указать на проблему:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private int numClicks = 0; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     button1.Click += button1_Click; 
     this.Text = numClicks.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     numClicks++; 
     //try uncommenting and commenting next line of code, and observe the difference: 
     //button1.Click -= button1_Click; 
     Form1_Load(sender, e); 
    } 

} 
+0

Я могу видеть - спасибо. Но если я раскомментирую строку, как было предложено, событие Load все еще выполняется дважды , поэтому я не уверен на 100%, чтобы зафиксировать свою часть, так как при первом событии Load свойство whereClause элемента управления еще не установлено. –

+0

Нет, это не так. Переместите строку numClicks ++ до последней line Form1_Load, и вы увидите, что он увеличивается на единицу, если вы раскомментируете button1.Click - = button1_Click; line в методе button1_Click. Вы также можете установить точку останова в любом месте метода Form1_Load и убедиться в том, что это будет ударил только один раз. –

+0

Кажется, что мой работает по-разному. Просто для подтверждения: если я запустил ваш код как есть, заголовок формы будет расти экспоненциально. Это имеет смысл. Но если я раскомментирую строку (или переместим строку кода как было предложено), то заголовок формы увеличивается с шагом 2. Это правильно? Добавление контрольных точек показывает мне, что Form1_Load выполняется дважды. –

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