none
Log出力時のカーソル位置について RRS feed

  • 質問

  • RichTextBoxを使用してLog出力を行っているのですが、複数行出力させたとき、カーソル位置が1行目から動かないため、最新のLog出力結果を見るにはスクロールバーを使用しないとならない状態になっています。

    常に、最新のLogが見れるようにするために、カーソル位置を最新のLog出力の行に合わせるようにするにはどのようにしたらよいでしょうか?

    2011年1月17日 2:43

回答

すべての返信

  • 以下をログテキストの更新時、又は定期的なタイマーで実行すればよいかと思います。

    this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length; 
    this.richTextBox1.ScrollToCaret();
    
    

    • 回答としてマーク Monkeychack 2011年1月18日 3:36
    2011年1月17日 2:55
  • Focusメソッドがあった方が堅いかもしれませんね。

    TextBox(またはRichTextBox)の最後の行までスクロールさせる
    http://dobon.net/vb/dotnet/control/tbscrolltolast.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Monkeychack 2011年1月18日 3:36
    2011年1月17日 3:04
    モデレータ
  • 以下のコードで問題なく動作したので大丈夫かなと思ってしまいましたが、

     

    private void button1_Click(object sender, EventArgs e)
    {
    	this.richTextBox1.Text += DateTime.Now.ToString("HHmmss") + Environment.NewLine;
    	this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length; 
    	this.richTextBox1.ScrollToCaret();
    }
    
    

    しかしながら、MSDNライブラリには、たしかに以下の記述がありました。

    「コントロールにフォーカスがない場合、またはカレットが既にコントロールの表示領域に位置している場合、このメソッドは無効です。」

    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.textboxbase.scrolltocaret(v=VS.100).aspx

     

    なので、trapemiyaさんの仰るとおり「あった方が堅い」ですね。

    2011年1月17日 3:18
  • ご返答感謝致します。問題の6割ほどは解決しました!

    Log出力が少しずつ出てくる際は、この方法で問題ないのですが、リンク先のコメント欄と同様の症状で、大量のLogメッセージを続けて出す際の場合、新しいLogメッセージを出力する度にスクロールが毎回文頭に移動するため、Log出力が最初のLogと最新のLogの間をいったりきたりしながら出力してしまうという現象が起きてしまっています。

    リンク先のコメント欄で匿名さんが

    Enabled=False と .Enabled=True で挟んで、これを行うと、
    フォーカスが外れるので.Focus()でフォーカスし直す

    でなんとか解決したとおっしゃっていますが、私の場合はうまく行きません。

    2011年1月18日 6:59
  • すみません。自己レスです。

    honefaiさんの例文のように、出力させるデータの取得を下記より行っていたのですが、

    this.richTextBox1.Text += message + "\n";

    これを下記のようにAppendTextに書き換えたところ上記問題が解決し、常にRichTextBoxの最後の行までスクロールさせて表示させる事ができました。

    this.richTextBox1.AppendText(message + "\n");

     

    問題は全て解決しました。ご返答感謝致します。

    2011年1月18日 7:48