我的按钮需要两次点击而不是一次

时间:2012-01-12 12:19:09

标签: c# button click

我正在使用C#中的一个小应用程序刷新网页,直到满足某些条件。我有一个“火”=启动刷新按钮和“停止!”应该停止操作的按钮。我的问题是需要2次尝试点击停止按钮而不是1.下面是我的代码:

使用计时器更新了代码。我仍然认为可以更好地使用计时器,我认为它在前2-3次刷新后不会每秒更新或根本不刷新。我的代码中是否有任何我无法检测到的缺陷?

private void FireButtonClick(object sender, EventArgs e)
{

    try
    {
        if (webBrowser1.Url.ToString().StartsWith("some url"))
        {
            _stopped = false;
            _timer.Tick += new EventHandler(RefreshBrowser);
            _timer.Interval = (1000) * (1);
            _timer.Enabled = true;
            _timer.Start();
       }
        else
        {
            MessageBox.Show("You must logon first.");
            return;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void RefreshBrowser(object sender, EventArgs e)
{
    string content = "disabled";
    string baseUrl = @"http://some url";
    string newUrl = string.Empty;
    string buttonXpath = @"/html/body/div/div[6]/table/tr/td[2]/table/tr/td/table/tr/td/table/tr[3]/td[2]/div[4]/a";
    webBrowser1.Refresh();
    _proceed = false;
    if (!content.ToLower().Equals("disabled") && !_stopped)
    {

        if (!_stopped)
        {
            HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument();
            htmlDocument.LoadHtml(webBrowser1.DocumentText);
            HtmlNode node = htmlDocument.DocumentNode.SelectSingleNode(buttonXpath);
            content = node.GetAttributeValue("disabled", string.Empty);
            newUrl = node.GetAttributeValue("href", string.Empty);
        }
    }
    else
    {

        webBrowser1.Navigate(baseUrl + newUrl);
    }


}

private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
    _proceed = true;
    urlTextBox.Text = webBrowser1.Url.ToString();
}

private void MainPageButtonClick(object sender, EventArgs e)
{
    try
    {
        webBrowser1.Navigate(_mainPage);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void GoButtonClick(object sender, EventArgs e)
{
    try
    {
        webBrowser1.Navigate(urlTextBox.Text);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}

private void StopButtonClick(object sender, EventArgs e)
{
    _timer.Stop();
    _proceed = true;
    _stopped = true;
}

}

3 个答案:

答案 0 :(得分:3)

您应该真正修改代码以使用计时器。当你滥用GUI线程并定期调用Application.DoEvents();时,只能在那个地方处理点击,这意味着你必须进入循环来处理事件。

这绝对不适合GUI编程。改为使用计时器。

Here是一个关于如何使用定时器定期调用方法的示例。在您的情况下执行页面刷新。

答案 1 :(得分:2)

在我看来,这是因为您正在同一个线程中执行所有操作,因此当您的代码运行时,无法进行UI交互(=首次点击),并且当页面重新加载时,UI交互是可能的(=第二次点击)。如果这是问题,请在单独的线程中执行refresch逻辑。

类似的东西:

private void FireButtonClick(object sender, EventArgs e)
{
    Thread worker = new Thread(new ThreadStart(delegate()
    {
        //your code
    });
    worker.IsBackground = true; //so it does not block the app from being closed
    worker.Start();
}

如果您在线程中访问UI元素,您还需要使用Invoke

答案 2 :(得分:0)

我的猜测是你陷入For循环并且在循环完成之前无法停止。这就是为什么它似乎需要两次点击,实际上它只是等待停止。

尝试使用执行网页刷新的线程并在Run按钮中调用thread.run()并单击Stop按钮中的thread.stop()。由于网页刷新将在单独的线程中进行,因此它永远不会干扰您的UI交互。