2009-07-30 10 views
4

Windowsフォームアプリケーションで、1行にテキストを入力するための高さから始まるテキストボックスを作成しました。しかし、ユーザーがコントロール内にラップされたテキストを入力すると、自動的にその高さが増えるようにしたいと思います。展開可能なWinForms TextBox

現在のところ、このテキストボックスでは、プロパティmultilineとwordwrapをtrueに設定しています。私はTextChangedイベントを使って、テキストがラップされた時を判断しようとしましたが、これで私に役立つプロパティを見つけることができません。 Linesプロパティはラップされたテキストのヘルプを提供しません。ユーザーが入力したテキストのみが新しい行を開始するために入力します。

テキストボックスの幅を超えてテキストが折り返されるたびに、テキストボックスの高さを拡大するにはどうすればよいですか?

答えて

7

同じ種類、お使いのTextChangedイベントでこれを置きます。

+0

偉大な答えと私は私のプロジェクトでこれを使用します。ありがとう! –

+0

+1 TextRenderer.MeasureText –

0

残念ながら、私は詳細を提供することはできませんが、おそらくカスタム実装を行う必要があります。

私は新しいテキストボックスタイプ - ExpandableTextBox - を手に入れて実装する必要があります。 (私の経験では、癖の多くが付属しています気難しい制御の一種である、)あなたが代わりにリッチテキストボックスを使用して喜んでいる場合http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/11dfb280-b113-4ddf-ad59-788f78d2995a

2

また、これはあなたが探しているものに関連すると思われます、あなたはあなたに新しい必要なサイズを与えるContentsResizedイベント、使用することができます。

private void HandleContentsResized(object sender, ContentsResizedEvenetArgs e) 
{ 
    int newheight = e.NewRectangle.Height; 
} 
+0

とは何かを持っているこれは私にとって、これはあまりにも本当に良い答えだった –

2

を私は別のプロジェクトのためのラベルコントロールのためにこれを書きました。私はどこかのコードプロジェクトからコードを取得しました。それをテキストボックスに変更するには、ベースを変更するだけの簡単な操作が必要です。

Dim s As SizeF = TextRenderer.MeasureText(txt.Text, txt.Font, txt.ClientRectangle.Size, TextFormatFlags.WordBreak) 
txt.Height = CInt(s.Height) 

あなたは最小の高さのいくつかの種類が必要になりますし、おそらくいくつかのパディングを指定するが、これは作業を行います。他の人が投稿しているようなアイデアの

public class GrowLabel : Label 
{ 
    private bool _growing; 
    //public bool GrowFontSize { get; set; } 

    public GrowLabel() 
    { 
     AutoSize = false; 
     //GrowFontSize = false; 
    } 

    public override sealed bool AutoSize 
    { 
     get { return base.AutoSize; } 
     set { base.AutoSize = value; } 
    } 

    private void ResizeLabel() 
    { 
     if (_growing) return; 
     try 
     { 
      _growing = true; 

      var sz = new Size(Width, Int32.MaxValue); 
      sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.WordBreak); 
      Height = sz.Height; 
     } 
     finally 
     { 
      _growing = false; 
     } 
    } 

    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     ResizeLabel(); 
    } 

    protected override void OnFontChanged(EventArgs e) 
    { 
     base.OnFontChanged(e); 
     ResizeLabel(); 
    } 

    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     ResizeLabel(); 
    } 
} 
+0

おかげで、AdamSaneを、働いていました。私はAndy'sがもっとシンプルで、代わりに使用されていることを発見しました。 –

2

AdamSaneの投稿は役に立ちましたが、テキストボックスは成長しませんでした。私はいくつかの変更を加えるつもりです。私は10行程度まで成功して以下のコードを使用してい

class GrowTextBox : TextBox 
{ 
    private double m_growIndex = 0.0; 
    private Timer m_timer; 

    public GrowTextBox() 
    { 
     AutoSize = false; 
     this.Height = 20; 

     // Without the timer, I got a lot of AccessViolationException in the System.Windows.Forms.dll. 
     m_timer = new Timer(); 
     m_timer.Interval = 1; 
     m_timer.Enabled = false; 
     m_timer.Tick += new EventHandler(m_timer_Tick); 

     this.KeyDown += new KeyEventHandler(GrowTextBox_KeyDown); 
    } 

    void GrowTextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) 
     { 
      this.SelectAll(); 
     } 
    } 

    void m_timer_Tick(object sender, EventArgs e) 
    { 
     var sz = new Size(Width, Int32.MaxValue); 
     sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.TextBoxControl); 

     m_growIndex = (double)(sz.Width/(double)Width); 

     if (m_growIndex > 0) 
      Multiline = true; 
     else 
      Multiline = false; 

     int tempHeight = (int)(20 * m_growIndex); 

     if (tempHeight <= 20) 
      Height = 20; 
     else 
      Height = tempHeight; 

     m_timer.Enabled = false; 
    } 

    public override sealed bool AutoSize 
    { 
     get { return base.AutoSize; } 
     set { base.AutoSize = value; } 
    } 


    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     m_timer.Enabled = true; 
    } 

    protected override void OnFontChanged(EventArgs e) 
    { 
     base.OnFontChanged(e); 
     m_timer.Enabled = true; 
    } 

    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     m_timer.Enabled = true; 
    } 
} 
1

、それは1つの文字をオフに取得しますが、これは私の作品:私の改造は以下の通りです。 7 - - のようなランダムな数字について私に聞かないでください12、彼らはパディング

private void txbDescription_TextChanged(object sender, EventArgs e) 
    { 
     SizeF s = TextRenderer.MeasureText(txbDescription.Text, txbDescription.Font, txbDescription.ClientRectangle.Size, TextFormatFlags.TextBoxControl); 

     int lines = (int)Math.Ceiling((decimal)Convert.ToInt32(s.Width - 7)/((decimal)txbDescription.Width - 12)); 

     if (lines == 0) 
     { 
      txbDescription.Height = 20; 
     } 
     else 
     { 
      txbDescription.Height = 20 + (lines - 1) * 13; 
     } 
    } 
関連する問題