Получаю список 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 попросту не работает. Или не успевает отработать. Есть ли выход из ситуации?
После выбора каждой строки нужно дожидаться пока 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
. Так можно будет грузить страницы напрямую из файлов без визуального компонента.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Суть такая, пилю процедурную генерацию уровня из готовых комнат/модулей
Есть 4 textbox или 4 NumericUpDown с разными значениями (15, 2
На днях немного углубился в то, как работает этот фреймворк, как фильтрует,обрабатывает данные и тд