2010-06-09 6 views
0

J'ai une application Windows Forms (en utilisant C#). Il affiche une page Web et dispose d'une combinaison textbox/botton qui peut être utilisée pour rechercher du texte affiché pour l'utilisateur. Actuellement, je recherche le texte interne de tous les éléments pour le texte dans la zone de texte. Et puis j'ai éliminé les éléments qui sont redondants (par exemple un mot pourrait être dans un élément 'p' et 'b' où le 'b' est un élément enfant de 'p' donc l'élément retourné devrait être 'b') . Enfin, je lance la méthode ScrollIntoView (true) sur l'élément found.Ajout d'un champ de recherche à un contrôle de navigateur Web Windows Forms qui met en évidence le texte

Je voudrais maintenant ajouter une fonction qui met en évidence le texte (comme si vous recherchez un terme dans un vrai navigateur Web). Ma première pensée a été d'injecter du code html et/ou javascript autour du texte, mais cela semble être une solution compliquée.

Des idées sur comment je devrais faire cela? Merci de votre aide!

+0

Voici un article qui vous montre comment procéder. http://www.codewrecks.com/blog/index.php/2009/02/13/highlight-words-in-webbrowser-control/ –

+0

Merci, mais cette solution injecte html dans la page qui pourrait gâcher la mise en page et J'essaie d'éviter cette route. J'ai trouvé un lien sur cette page qui essaie de le faire avec javascript et je vais y jeter un coup d'oeil. – evan

Répondre

0

Je sais que ce sujet est assez ancien mais j'ai rencontré le même problème que l'auteur du sujet et pendant toutes les recherches que j'ai faites pour le résoudre, j'ai finalement trouvé ma réponse. Je profite donc de l'occasion pour le partager ici.

Voici les méthodes que j'utilise pour effectuer ma recherche dans mon navigateur Web et de mettre en évidence le mot trouvé:

private bool FindFirst(string text) 
    { 
    var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument; 
    var sel = (IHTMLSelectionObject)doc.selection; 
    sel.empty(); // get an empty selection, so we start from the beginning 
    var rng = sel.createRange() as IHTMLTxtRange; 
    if (rng != null && rng.findText(text, 1000000000, 0)) 
    { 
     rng.select(); 
     rng.scrollIntoView(false); 
     return true; 
    } 
    return false; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public bool FindNext(string text) 
    { 
    var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument; 
    var sel = (IHTMLSelectionObject)doc.selection; 
    var rng = sel.createRange() as IHTMLTxtRange; 
    if (rng != null) 
    { 
     rng.collapse(false); // collapse the current selection so we start from the end of the previous range 
     if (rng.findText(text, 1000000000, 0)) 
     { 
      rng.select(); 
      rng.scrollIntoView(false); 
      return true; 
     } 
     else 
      return FindFirst(text); 
    } 
    return false; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public bool FindPrevious(string text) 
    { 
    var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument; 
    var sel = (IHTMLSelectionObject)doc.selection; 
    var rng = sel.createRange() as IHTMLTxtRange; 
    if (rng != null) 
    { 

     rng.collapse(true); // it should be true,so it goes to start of the document 
     var found = rng.findText(text, -1, 0); // Range count value should give negative value 
     if(!found) 
     { 
      rng.moveEnd("textedit"); 
      found = rng.findText(text, -1, 0); 
     } 
     if (found) 
     { 
      rng.select(); 
      rng.scrollIntoView(false); 
      return true; 
     } 
    } 
    return false; 
    } 

Le seul « problème » avec ce morceau de code est que seule une occurrence de les mots trouvés sont sélectionnés à la fois.

Questions connexes