Ошибка «Указанное приведение неверно» - PullRequest
2 голосов
/ 05 марта 2012

Я использую этот код, который предназначен для проверки текста в webBrowser1, хотя вместо этого я получаю сообщение об ошибке «Указанное приведение недействительно».для string docText = webBrowser1.Document.Body.InnerText;.Есть идеи почему?Может быть потому, что я захожу в веб-браузер из другого потока?Спасибо.

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string docText = webBrowser1.Document.Body.InnerText;

    if (docText == "Hello")
    {
        MessageBox.Show("Alerted!");
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

Ответы [ 4 ]

5 голосов
/ 05 марта 2012

Исключение может быть вызвано доступом к свойству WebBrowser.Document из потока, который не является основным потоком пользовательского интерфейса .Вы можете убедиться в этом, посмотрев следующие строки в трассировке стека System.InvalidCastException:

в System.Windows.Forms.UnsafeNativeMethods.IHTMLDocument2.GetLocation ()
в System.Windows.Forms.WebBrowser.get_Document ()

Если это так, попробуйте вместо этого передать содержимое веб-страницы в фоновый поток в качестве аргумента:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var docText = (string)e.Argument;
}

private void timer1_Tick(object sender, EventArgs e)
{
    var docText = webBrowser1.Document.Body.InnerText;
    backgroundWorker1.RunWorkerAsync(docText);
}
2 голосов
/ 05 марта 2012

Я попробую с ...

backgroundWorker1.RunWorkerAsync(webBrowser1.Document.Body.InnerText);

это удалит исключение приведения

, а в DoWork

string docText = e.Argument.ToString();

это уберет проблему с потоком пользовательского интерфейса

0 голосов
/ 08 марта 2012

. Секция .Body возвратит исключение нулевой ссылки на объект, и .innerHTML не будет распознан как строка, если вы не ожидали загрузки страницы, возможно, это вызывает ошибку, полученную в результате.Вы правильно сделали, ожидая загрузки документа перед всем этим?Посмотрите мои ответы о том, как правильно ждать в веб-браузере, если вам нужна помощь.

0 голосов
/ 05 марта 2012

Возможно, вам следует дождаться события DocumentCompleted от Ctrl WebBrowser, прежде чем обращаться к Document.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...