Моей кнопке нужно два клика вместо одного - PullRequest
4 голосов
/ 12 января 2012

Я работаю над небольшим приложением на 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 ]

3 голосов
/ 12 января 2012

Вы должны действительно изменить свой код, чтобы использовать таймер.Когда вы неправильно используете поток GUI и делаете периодические вызовы Application.DoEvents();, щелчок может обрабатываться только в этом месте, что означает, что вы должны войти в цикл для обработки события.

Это абсолютно не нужно для программирования GUI.Вместо этого используйте таймер.

Здесь - пример использования таймера для периодического вызова метода.В вашем случае необходимо выполнить обновление страницы.

2 голосов
/ 12 января 2012

Мне кажется, что это потому, что вы выполняете все в одном потоке, поэтому, когда ваш код выполняется, взаимодействие с пользовательским интерфейсом невозможно (= первый щелчок), а во время перезагрузки страницы взаимодействие с пользовательским интерфейсом невозможно (= второй щелчок)).Если это проблема, выполните логику обновления в отдельном потоке.

Что-то вроде:

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!

0 голосов
/ 12 января 2012

Полагаю, вы застряли в цикле For и не можете остановиться, пока этот цикл не завершится. Вот почему, кажется, нужны два щелчка, на самом деле он просто ждет остановки.

Попробуйте вместо этого использовать поток, который выполняет обновление веб-страницы и вызывает thread.run () при нажатии кнопки «Выполнить» и thread.stop () при нажатии кнопки «Стоп». Поскольку обновление веб-страницы будет происходить в отдельном потоке, оно никогда не будет мешать взаимодействию с пользовательским интерфейсом.

...