DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowserのスクロール制御について

環境/言語:[WindowsXP]
分類:[.NET]

WebBrowserを使用して簡単なエディタを作成しているのですが
データが長くなると、TextBoxで編集や修正した場合WebBrowserに
再表示しても、スクロールが自動的にTopに行ってしまい修正箇所が
分からなくなってしまいます。

1)再表示直前にWebBrowserの現在位置をホールド
2)再表示の時には前回ホールドした位置へ自動スクロール

の様にしたいのですが何か方法はありませんでしょうか?
よろしくお願いします。

2005 .NET
2008/09/30(Tue) 14:33:45 編集(投稿者)

Body の scrollLeft/scrollTop で制御できるかと思います。GetAttribute/SetAttribute で取得・設定してください。
ただ、DOCTYPE 宣言によっては Body からじゃ取得できない場合があります。
http://www.google.co.jp/search?q=scrolltop+doctype&lr=lang_ja&ie=utf-8&oe=utf-8
System.Windows.Forms.WebBrowser だとこの場合、Body の Parent に当たる要素を使えばいいみたいです。
■No23086に返信(Hongliangさんの記事)
> 2008/09/30(Tue) 14:33:45 編集(投稿者)
>
> Body の scrollLeft/scrollTop で制御できるかと思います。GetAttribute/SetAttribute で取得・設定してください。
> ただ、DOCTYPE 宣言によっては Body からじゃ取得できない場合があります。
> http://www.google.co.jp/search?q=scrolltop+doctype&lr=lang_ja&ie=utf-8&oe=utf-8
> System.Windows.Forms.WebBrowser だとこの場合、Body の Parent に当たる要素を使えばいいみたいです。

早速のご返事ありがとうございます
お教えいただいた関連サイトを色々調べたのですが、具体的なコードの記述が
私には分からずあれこれ探していましたらそのものズバリの様な
例が見つかりテストしたのですが、^^^^^のところでエラーになります。

http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200404/04040003.txt

Private Sub Text1_Change()

Dim Contents As String
Dim FileName As String

Contents = Text1.Text
FileName = "C:\temp.htm"

Open FileName For Output As #1
Print #1, Contents;
Close #1

------------------------------------------------以下でテスト
Dim x as integer
Dim y as integer


x = WebBrowser1.Document.Body.scrollLeft
y = WebBrowser1.Document.Body.scrollTop
WebBrowser1.Navigate "C:\temp.htm"
WebBrowser1.Document.parentWindow.scrollTo x, y
  ^^^^^^^^^^
End Sub


^^^^^^^^^^のところで・・・メンバではありませんのエラーがでます

何か設定とかの問題があるのでしょうか?
> Body の scrollLeft/scrollTop で制御できるかと思います。GetAttribute/SetAttribute で取得・設定してください。
■No23088に返信(Hongliangさんの記事)
>>Body の scrollLeft/scrollTop で制御できるかと思います。GetAttribute/SetAttribute で取得・設定してください。

Hongliang 様
色々とヒントを頂きありがとうございます。
その後色々と関連検索で探したのですが
具体的なコードの書き方が分かりません

>GetAttribute/SetAttribute で取得・設定とはどのよな
コードになるのでしょうか?
よろしければご指導いただければありがたいのですが。
あっと、ScrollTop/ScrollLeft は HtmlElement にプロパティが用意されてたんだ。気付かなかった。
ってことは GetAttribute/SetAttribute の出番は無しでした。
ミスリードしてしまってすいません。

Body の位置を取得して、それをなんかほかの要素の位置に設定しても意味が無いでしょう。
Body から取得した位置は Body の位置に設定してください。

それはそれとして、WebBrowser の Navigate は非同期的に行われます。
つまり画面遷移が完了しないうちに処理を返してきます。
Navigate 直後に Document 取得しようとしても不完全な Document しか手に入りません。
Navigate 後に Document 以下を操作したいのなら、DocumentCompleted イベントでやる必要があります。
■No23098に返信(Hongliangさんの記事)
> あっと、ScrollTop/ScrollLeft は HtmlElement にプロパティが用意されてたんだ。気付かなかった。
> ってことは GetAttribute/SetAttribute の出番は無しでした。
> ミスリードしてしまってすいません。
>
> Body の位置を取得して、それをなんかほかの要素の位置に設定しても意味が無いでしょう。
> Body から取得した位置は Body の位置に設定してください。
>
> それはそれとして、WebBrowser の Navigate は非同期的に行われます。
> つまり画面遷移が完了しないうちに処理を返してきます。
> Navigate 直後に Document 取得しようとしても不完全な Document しか手に入りません。
> Navigate 後に Document 以下を操作したいのなら、DocumentCompleted イベントでやる必要があります。

Hongliang様
>Navigate は非同期的に行われます
につきましては、適当にタイマーをかませています。

色々ご助言を頂いているのですが、スクロール部分の具体的なコードが分かりません。
> Body から取得した位置は Body の位置に設定してください。
とは、どのようなコードになるのでしょか?

当方の知識不足で申し訳ございません

DOBON.NET | プログラミング道 | プログラミング掲示板