2013-05-29 136 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被执行两次。 –