Как программно выделить текст в элементе управления webBrowser? C # - PullRequest
3 голосов
/ 12 октября 2010

Вот проблема: я хочу разрешить пользователю моей программы искать элемент управления webBrowser по заданному ключевому слову (стандарт Ctrl + F).У меня нет проблем с поиском ключевого слова в документе и выделением всех экземпляров с помощью span и функции replace ().У меня возникли проблемы с получением функции «найти следующее», с которой я хочу работать.Когда пользователь нажимает кнопку «Найти далее», я хочу, чтобы документ перешел к следующему экземпляру.Если бы я мог получить ограничивающий прямоугольник, я мог бы использовать функцию навигации.У меня есть такая же функциональность, работающая в поле расширенного текста с использованием следующего кода

                //Select the found text
                this.richTextBox.Select(matches[currentMatch], text.Length);
                //Scroll to the found text
                this.richTextBox.ScrollToCaret();
                //Focus so the highlighting shows up
                this.richTextBox.Focus();

Может кто-нибудь предоставить методологию, чтобы заставить это работать в webBrowser?

1 Ответ

1 голос
/ 12 октября 2010

Я реализовал функцию поиска в приложении WinForms, которое имело встроенный элемент управления веб-браузера. В нем было отдельное текстовое поле для ввода строки поиска и кнопка «Найти». Если строка поиска изменилась со времени последнего поиска, нажатие кнопки означало обычную находку, если нет, это означало «найти снова». Вот обработчик кнопки:

private IHTMLTxtRange m_lastRange;
private AxWebBrowser m_browser;

private void OnSearch(object sender, EventArgs e) {

    if (Body != null) {

        IHTMLTxtRange range = Body.createTextRange();

        if (! m_fTextIsNew) {

            m_lastRange.moveStart("word", 1);
            m_lastRange.setEndPoint("EndToEnd", range);
            range = m_lastRange;
        }

        if (range.findText(m_txtSearch.Text, 0, 0)) {

            try {
                range.select();

                m_lastRange = range;

                m_fTextIsNew = false;
            } catch (COMException) {

                // don't know what to do
            }
        }
    }
}

private DispHTMLDocument Document {
    get {
        try {
            if (m_browser.Document != null) {
                return (DispHTMLDocument) m_browser.Document;
            }
        } catch (InvalidCastException) {

            // nothing to do
        }

        return null;
    }
}

private DispHTMLBody Body {
    get {
        if ( (Document != null) && (Document.body != null) ) {
            return (DispHTMLBody) Document.body;
        } else {
            return null;
        }
    }
}

m_fTextIsNew имеет значение true в обработчике TextChanged окна поиска.

Надеюсь, это поможет.

Редактировать: добавлены свойства тела и документа

...