【问题标题】:Running Page Load multiple times多次运行页面加载
【发布时间】:2013-05-24 14:36:45
【问题描述】:

我在一个包含过滤器字段并返回 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 仅在单击 Search 时运行一次?

【问题讨论】:

  • 那么不要从你的FilterApplied方法调用Page_Load
  • 不工作。 “如果我不从 FilterApplied 调用它,那么 where 子句仍然是空的。”
  • 为什么这个问题不清楚或没有用(或显示缺乏研究工作?如果不清楚,我可以尝试纠正它。

标签: c# events user-controls postback


【解决方案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);
    }

}

【讨论】:

  • 我可以看到 - 谢谢。但是如果我按照建议取消注释该行,Load 事件仍然运行两次,所以我不能 100% 确定我的部分,因为第一次发生 Load 事件时,控件的 whereClause 属性尚未设置。
  • 不,它没有。将 numClicks++ 行移动到 Form1_Load 的最后一行,如果取消注释 button1.Click -= button1_Click;,您会看到它加一。 button1_Click 方法中的行。您还可以在 Form1_Load 方法中的任何位置设置断点,并自己查看它只会被击中一次。
  • 似乎我的工作方式有所不同。只是为了确认:如果我按原样运行您的代码,表单的标题会呈指数增长。这就说得通了。但是,如果我取消注释该行(或按照建议移动代码行),那么表单标题会增加 2。这是正确的吗?添加断点显示 Form1_Load 执行了两次。
  • 这表明您实际上订阅了两次点击事件。您可能在表单设计模式下在按钮 -> 属性 -> 事件上执行过一次,然后在 Form_Load 方法中再次执行此操作。删除其中一个,您的用户控件可能就是这种情况。
  • 啊,这样更好。谢谢。
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多