web-dev-qa-db-ja.com

C#コンテンツに合わせてテキストボックスのサイズを変更する

ユーザーがテキストボックスにテキストを書き込むことができるプログラムを作成しています。テキストボックス自体のサイズを変更して、コンテンツに合うようにします。私は次を試しました:

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
    System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont);
    this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0);
}

TextChangedEventArgsでグラフィックが機能しないというエラーが表示されます。テキストボックスのサイズを変更できる別の方法はありますか?

24
user744289

以下のようなコードを試してください。私にとってはうまくいった。

private void textBox1_TextChanged(object sender, EventArgs e)
{
  Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
  textBox1.Width = size.Width;
  textBox1.Height = size.Height;
}

詳細については、 TextRenderer.MeasureText() を参照してください

テキストボックスのfixed widthアスペクトが他で議論されていないので、この回答を追加しています。テキストボックスの幅が固定されていて、その高さのみを調整したい場合は、次のようなことができます。

このようなものは、複数行のワードラップされたテキストボックス自体でのテキストの描画方法として、テキストの高さを示します。

SizeF MessageSize = MyTextBoxControl.CreateGraphics()
                                .MeasureString(MyTextBoxControl.Text,
                                                MyTextBoxControl.Font,
                                                MyTextBoxControl.Width, 
                                                new StringFormat(0));

StringFormatがどうあるべきかはわかりませんが、値StringFormatFlagsはデフォルトのTextBoxに適用されないようです。

これで、MessageSize.Heightを使用して、テキストボックス内のテキストの高さがわかります。

6
Mike de Klerk

間違ったイベントへのバインディング。グラフィックオブジェクトをTextChangedEventArgsオブジェクトで使用することはできません。

TextChangedイベントを使用してみてください。次のスニペットが機能しています:

public Form1()
{
    InitializeComponent();

    this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
}

void textBox1_TextChanged(object sender, EventArgs e)
{
    System.Drawing.SizeF mySize = new System.Drawing.SizeF();

    // Use the textbox font
    System.Drawing.Font myFont = textBox1.Font;

    using (Graphics g = this.CreateGraphics())
    {
        // Get the size given the string and the font
        mySize = g.MeasureString(textBox1.Text, myFont);
    }

    // Resize the textbox 
    this.textBox1.Width = (int)Math.Round(mySize.Width, 0);
}

}

4
Daniel Peñalba

私は同じ問題を抱えていましたが、より簡単な方法で解決しました。

LabelコントロールのAutoSizeプロパティを使用しました。フォームに非表示のラベルを追加し、AutoSizeプロパティをTrueに設定しました。 TextBoxのサイズを変更する必要がある場合、次のコードを使用します。

MyLabel.Text = MyTextBox.Text;
MyTextBox.Size = MyLabel.Size;

より良い結果を得るために、ラベルの最大サイズと最小サイズを設定します。楽しんで

3
Nour Assi

文字列を測定するGraphicsインスタンスを作成するには、フォームのCreateGraphics()メソッドを使用する必要があります。

TextChangedEventArgsクラスにはGraphicsプロパティがありません。つまり、PaintEventArgsイベントハンドラーに渡されるPaintクラスのプロパティです。

1
samjudson

これを試して:

using System.Drawing;
...

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    // Determine the correct size for the text box based on its text length   

    // get the current text box safely
    TextBox tb = sender as TextBox;
    if (tb == null) return;

    SizeF stringSize;

    // create a graphics object for this form
    using(Graphics gfx = this.CreateGraphics())
    {
        // Get the size given the string and the font
        stringSize = gfx.MeasureString(tb.Text, tb.Font);
    }

    // Resize the textbox 
    tb.Width = (int)Math.Round(stringSize.Width, 0);

}

基本的に、フォーム用に独自のGraphicsオブジェクトを作成し、TextBoxのテキストとフォントに基づいて測定します。 usingGraphicsオブジェクトを適切に破棄します-以前のコードは恐ろしくリークされていたでしょう!

1
Polynomial

できるGraphics.Measure文字列oPaintEventArgs、ないTextChangedEventArgs

あなたが欲しいと思うのはこれです

System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
Graphics graphics = this.CreateGraphics();
SizeF textSize = graphics.MeasureString("This is a test", myFont);

問題は、パブリックコンストラクターがないため、単に割り当てるだけではGraphicsオブジェクトを作成できないため、TextRenderer.MeasureTextを使用する方がよいことです。 、 http://msdn.Microsoft.com/en-us/library/y4xdbe66.aspx

TextRendererはGDIを使用し、GraphicsはGDI +を使用するため、Widthプロパティから取得した値に少し余裕を持たせる必要があるため、精度が低下します。

お役に立てれば

0
aelena

目的が何であれ。

テキストボックスのサイズを、このボックス内のテキストである文字列に基づいて動的に設定する必要がある場合、Niceオプションはありません

理由: MeasureStringは、通常の文字列フォーマッタを独自の幅と高さの区切り文字として使用します。手段、キャリッジリターン、ラインフィードも解析されます。結果としてsizeF.WidthとsizeF.Heightが得られます。

文字列(およびそのフォントと行数)に応じて、これらの両方の変数は値を運ぶことができますが、テキストボックスの幅/高さの値として使用するには役に立たないことがあります(親フォームの値よりも大きい可能性があり、これにより、テキストボックスのサイズが、親フォームの境界を超える左および下の境界を持つサイズに変更されます)。

目的に応じて、いくつかのソリューションがまだ利用可能です。

1つのアイデアは次のとおりです。デザイナーでテキストボックスを作成します。サイズ= 100 X100。ワードラッピングを有効にする

テキストボックスのOnTextChangedイベントハンドラーで、テキストボックスの幅を自分で定義した値(たとえば、parentform.Widthまたは別のハード値)に変更します。

これにより、ワードラップはテキストボックス内の文字列を再計算します。これにより、ワードラップが有効になっているため、テキストボックス内のすべての文字が再配置されます。

たとえば、テキストボックスの高さをparentform.Heightにハードに設定できます。

しかし、ベター:texbox.GetPositionFromCharIndex(textbox.TextLength -1)メソッドのReturnValue(Point)のY値に基づいて、動的に高さを設定します。次に、Math.Min()で、どちらが小さいか(parentform.HeightまたはPoint.Y)を決定し、テキストボックスのサイズを新しいSize(previousDeterminedWidth、nowDeterminedHeight)にリセットします。

スクロールバーが有効になっている場合)、幅の計算に約17ピクセルを追加することに留意してください。

宜しくお願いします

0
icbytes

_yourTextBox.AutoSize = true;_を設定しようとしましたか?このプロパティはGUIデザイナーでは非表示にできますが、InitializeComponent();呼び出しの直後にフォームコンストラクターで設定できます。

0

最初に、TextBoxをそのコンテンツに合わせるメソッドを作成します。

private void AutoSizeTextBox(TextBox txt)
{
    const int x_margin = 0;
    const int y_margin = 2;
    Size size = TextRenderer.MeasureText(txt.Text, txt.Font);
    txt.ClientSize =
        new Size(size.Width + x_margin, size.Height + y_margin);
}

次にTextChangedイベントハンドラー呼び出しでAutoSizeTextBox()関数を作成しますTextBoxは、テキストが変更されたときにテキストに合わせます。

private void txtContents_TextChanged(object sender, EventArgs e)
{
    AutoSizeTextBox(sender as TextBox);
}

詳細は次のとおりです。

テキストボックスのサイズを合わせてテキストに変更

0
ajd.nas