WebBrowserDocumentCompleted не отрабатывает

162
10 октября 2018, 05:00

Получаю список html-файлов с путями к ним и сохраняю их в List<string> и DataGridView:

string[] _files = Directory.GetFiles(delDir, _del);
foreach (string fl in _files)
{
    myList.Add(new StringValue(fl));
}
myDataGridView.DataSource = myList;

На myDataGridView висит обработчик SelectionChanged, который получает имя файла из выделенной строки myDataGridView и передает его в объект WebBrowser с именем myWeb:

myWeb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(myWeb_DocumentCompleted_1);
myWeb.Navigate(new Uri(fileName));

Для объекта myWeb установлен обработчик DocumentCompleted.В его коде небольшой html-парсер:

HtmlDocument doc = myWeb.Document;
HtmlElementCollection tagCollection;
tagCollection = doc.GetElementsByTagName("div");

Затем из tagCollection я получаю нужные мне данные и сохраняю их в переменные string.

Т.е. получается схема: получаем путь и имя файла, сохраняем его в строку DataGrid, при выборе строки из DataGrid в WebBrowser загружается html-документ. Как только документ загрузился, срабатывает html-парсер, сохраняющий нужный мне текст или теги.

Но все это работает только если я сам выбираю строки, вручную. Попытался сделать чтобы строки выбирались сами таким образом:

foreach(DataGridViewRow row in myDataGridView.Rows)
{
    row.Selected = true;
}

Строки выбираются, но парсер не срабатывает, поскольку WebBrowser.DocumentCompleted попросту не работает. Или не успевает отработать. Есть ли выход из ситуации?

Answer 1

После выбора каждой строки нужно дожидаться пока WebBrowser загрузит и отработает страницу.

Для этого можно отслеживать событие DocumentCompleted у браузера.

//флаг для отслеживания
private bool isCompleted;
void myWeb_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //обработка страницы
    //...
    //после обработки устанавливаем флаг
    isCompleted = true;
}
//цикл обработки
foreach (DataGridViewRow row in myDataGridView.Rows)
{
    isCompleted = false;
    row.Selected = true;
    //дожидаемся завершения обработки
    while (!isCompleted)
    {
        Application.DoEvents();
    }
}

Также из кода неясно зачем при выборе каждой строки привязывать новый обработчик к DocumentCompleted. Достаточно одного глобального.

И если задача в данном случае состоит именно в разборе HTML файлов, то, возможно, будет проще использовать html-парсер (например, Html Agility Pack) вместо WebBrowser. Так можно будет грузить страницы напрямую из файлов без визуального компонента.

READ ALSO
Процедурная генерация уровня

Процедурная генерация уровня

Суть такая, пилю процедурную генерацию уровня из готовых комнат/модулей

157
С# WPF Слайдер в % изменение 4х значений сразу

С# WPF Слайдер в % изменение 4х значений сразу

Есть 4 textbox или 4 NumericUpDown с разными значениями (15, 2

166
Теория : Visual Studio + Python

Теория : Visual Studio + Python

Вопрос теоретическийЕсть скрипт написанный на Python

140
С# принцип работы Entity Framework

С# принцип работы Entity Framework

На днях немного углубился в то, как работает этот фреймворк, как фильтрует,обрабатывает данные и тд

150