2013-05-29 66 views
-1

我在包含篩選字段並返回WhereClause的aspx頁面上有一個用戶控件。用戶控制將在單擊搜索時引發名爲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中調用它,則where條款仍然是空的。

如何確保Page_Load只在點擊搜索時運行一次?

+0

請不要從你的'FilterApplied'方法調用'Page_Load'。 –

+0

不工作。 「如果我沒有從FilterApplied中調用它,那麼where條款仍然是空的。」 –

+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 ++行移到最後如果您取消註釋button1.Click - button1_Click; button1_Click方法中的行,您還可以在Form1_Load方法中的任意位置設置斷點,並查看您的自己是否會只打一次 –

+0

看起來像我的工作方式不一樣,只是爲了確認:如果我按照原樣運行代碼,表單的標題按指數級增長,這是有道理的,但如果我取消註釋行(或移動代碼行如建議),然後表單標題會增加2.我的增量是否正確?添加斷點顯示Form1_Load被執行兩次。 –