1

Ctrl+Fを押すとポップアップする[検索]ダイアログボックスで提供される検索機能を実装する必要があります。

ユーザーが検索する文字列を入力するテキストボックスと、[検索]ボタンがあります。ボタンがクリックされたとき、HTMLドキュメント内の一致を強調表示する必要があります。これは、[検索]ダイアログボックスに実装されているとおりです。

WebBrowserコントロールの[検索]ダイアログボックスをバイパスする方法はありますか?検索パラメータを「検索」機能に送信することは可能ですか?

助けてくれてありがとう。

編集

理想的には、[全世界のみに一致]、[ケースに一致]、[すべての一致を強調表示]など、[検索]ダイアログボックスで提供されるすべての機能を使用できるようになります...

4

2 に答える 2

0

これには多くの困難がありましたが、最終的に解決策が機能しました。少し面倒ですが、Winforms WebBrowser コントロールに対して意図したとおりに動作します。これは、Microsoft.mshtml 7.0.3300 参照がインポートされた .Net 4.0 にあります。

using mshtml;

private int _findClicks = 0;
private string _searchText = "";

public string SearchText
    {
        get { return _searchText; }
        set
        {
            if (value.ToUpper() != _searchText)
            {
                ClearFind();
                _searchText = value.ToUpper();
                txtSearch.Text = value.ToUpper();

                _findClicks = 0;
            }
        }
    }

private void btnSearch_Click(object sender, EventArgs e)
    {
        SearchText = txtSearch.Text;
        if (_findClicks == 0)
            FindFirst();
        else
            FindNext();
    }

 /// <summary>
    /// Search through all text to find. Sets all occurrences to background color yellow.
    /// </summary>
    private void FindFirst()
    {
            if (_searchText == "")
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            //Mark all occurrences with background color yellow
            while (true)
            {
                if ((range.findText(_searchText)) && (range.htmlText != "span style='background-color: yellow;'>" + _searchText + "</span>"))
                {
                    range.pasteHTML("<span style='background-color: yellow;'>" + _searchText + "</span>");
                }
                else
                    break;
            }
            //Move to beginning and select first occurence.
            range.moveStart("word", -9999999);
            range.findText(_searchText);
            range.select();
            _findClicks++;
        }

/// <summary>
    /// Finds next occurrence of searched text and selects it.
    /// </summary>
    private void FindNext()
    {
            if (_searchText == "")
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            range.collapse(false); // collapse the current selection so we start from the end of the previous range

            if (range.findText(_searchText, 1000000, 0))
            {
                range.select();
            }
            else // If at end of list, go to beginning and search one more time.
            {
                range.moveStart("word", -9999999);
                if (range.findText(_searchText, 1000000, 0))
                {
                    range.select();
                }
            }
    }

/// <summary>
    /// Remove highlighting on all words from previous search.
    /// </summary>
    private void ClearFind()
    {
            if (_searchText == "" || webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                return;
            IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
            IHTMLSelectionObject sel = doc.selection;
            IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
            range.moveStart("word", -9999999);
            while (true)
            {
                if ((range.findText(_searchText)) && (!range.htmlText.Contains("span style='background-color: white")))
                {
                    range.pasteHTML("<span style='background-color: white;'>" + _searchText + "</span>");
                }
                else
                    break;
            }

    }

繰り返しますが、これはやや面倒であり、おそらくかなりクリーンアップされる可能性があります。これは、Web ブラウザー コントロールの Ctrl+F 機能の基本をほぼ再現しています。将来のすべての読者に役立つことを願っています。

于 2014-11-04T15:36:03.310 に答える
0

自分で行うのはそれほど難しいことではありません。検索テキストボックスにあるものを次のように置き換えるだけです。検索用語が「hello」であるとします。次に、hello のすべての出現箇所を次のように置き換えます。

<font color="yellow">hello</font>

もちろん、この HTML は SPAN タグ (DIV タグのインライン バージョンであるため、SPAN を使用しても改行されませんが、DIV を使用すると改行されます) に置き換えることができます。ただし、どちらの場合も、これらのタグには両方とも style 属性があり、CSS を使用して色を変更したり、次のように CSS と互換性のある無数の他のプロパティを変更したりできます。

<SPAN style="background-color: yellow;">hello</SPAN>

もちろん、HTML を使用して色を変更する方法は他にも無数にあります。必要に応じて Web を自由に検索してください。

これで、dotnet の .Replace() 関数を使用してこれを行うことができます (検索されたテキストを置き換えます)。これは非常に簡単です。したがって、.DocumentText を使用してドキュメント全体を文字列として取得できます。すべての出現箇所が (.Replace() を使用して) 置き換えられたら、それを .DocumentText に戻すことができます (したがって、元のドキュメントを取得するために .DocumentText を使用しています)。文字列、および置き換えられた文字列で .DocumentText を設定します)。もちろん、実際の HTML 内のアイテムに対してこれを実行したくない場合は、以下のようにすべての要素に対して For Each ループを実行することで、ページ上のすべての要素をループすることができます。

For Each someElement as HTMLElement in WebBrowser1.Document.All

また、各要素には .InnerText/.InnerHTML と .OuterText/.OuterHTML があり、これらを取得 (読み取り) および設定 (置き換えられたテキストで上書き) できます。

もちろん、必要に応じて、.InnerText および/または .OuterText を置き換えて上書きしたいだけでしょう。

さらにサポートが必要な場合はお知らせください。どちらの場合でも、それがどのように解決したか、または問題に付加価値を与えるために私たちにできることが他にあるかどうかを知りたい. 乾杯。

于 2012-09-13T14:41:42.687 に答える