none
テキストボックスの幅について RRS feed

  • 質問

  • いつもお世話になっております。

    現在、テキストボックスのレイアウト幅を、入力可能文字数から動的に調整したいと思っております。
    例えばMaxLengthプロパティが10であればジャスト10文字分、50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整したいのですがどうもうまくいきません。
    下記のようにサイズを取得し、設定してもずれてしまいます。
    String str;
    str = str.PadRight(this.textBox1.MaxLength, '1');
    SizeF textBoxSize = this.textBox1.CreateGraphics().MeasureString(str, this.textBox1.Font);
    this.textBox1.Width = (int)System.Math.Ceiling(textBoxSize.Width);
    特にMaxLength値が多ければ多いほど、幅が足りなくなるようです。
    フォントはMS ゴシックを使用しています。

    以上、ご教授お願いいたします。

    2007年6月4日 9:49

回答

  • str = str.PadRight(this.textBox1.MaxLength, '8');

    str = str.PadRight(this.textBox1.MaxLength, 'あ');

    こうすると少しは良いかもしれません。

     

    >50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整

    MS ゴシックは固定長フォントですが全角半角文字によって横幅が違います。

    MaxLengthは全角半角どちらも一文字ですので、

    全角半角まじりでジャスト50文字分の横幅というのは存在しない数値です。

     

    追記:若干誤解しました。

     

    2007年6月4日 11:26
  • #投稿する直前にリロードしてみたら、えムナウさんに先を越されてた(^^;

    フォーム上の場合は以下のように、TextRenderer クラスの MeasureText メソッドが使えます。
    印刷時には MeasureCharacterRanges が使えます。

    サンプル:新規プロジェクトの Form1 コンストラクタを置換
    public Form1()
    {
        InitializeComponent();

        FlowLayoutPanel flp = new FlowLayoutPanel();
        flp.FlowDirection = FlowDirection.TopDown;
        flp.Dock = DockStyle.Fill;
        flp.Parent = this;

        for (int i = 0; i < 10; i++)
        {
            TextBox tb = new TextBox();
            tb.Font = new Font("MS ゴシック", i * 2 + 9);
            tb.MaxLength = i * 5 + 1;
            tb.Text = tb.MaxLength.ToString();
            tb.Width = TextRenderer.MeasureText(
                new string('あ', tb.MaxLength), tb.Font).Width;
            tb.Parent = flp;
        }

        this.WindowState = FormWindowState.Maximized;
    }

     


    #追記:TextRenderer は Framework2.0 で追加されたものでした。1.x 環境でしたら MeasureCharacterRanges を使ってみてください。

    #さらに追記:文字数になっていなかった点を修正。それと文章1行削除
    2007年6月4日 11:34
  • えムナウ様、度々お世話になっております。
    質問の表現が間違っておりました・・・。
    何文字分ではなく、何バイト分です。

    MaxLengthを50にすれば、最大50バイト分の幅という意味でした。
    2007年6月5日 6:59
  • TH01様、ご教授ありがとうございます。
    頂きましたサンプルのように
    TextRenderer.MeasureText
    を使用し無事目的が達成できました。
    本当にありがとうございました。
    2007年6月5日 7:01

すべての返信

  • str = str.PadRight(this.textBox1.MaxLength, '8');

    str = str.PadRight(this.textBox1.MaxLength, 'あ');

    こうすると少しは良いかもしれません。

     

    >50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整

    MS ゴシックは固定長フォントですが全角半角文字によって横幅が違います。

    MaxLengthは全角半角どちらも一文字ですので、

    全角半角まじりでジャスト50文字分の横幅というのは存在しない数値です。

     

    追記:若干誤解しました。

     

    2007年6月4日 11:26
  • #投稿する直前にリロードしてみたら、えムナウさんに先を越されてた(^^;

    フォーム上の場合は以下のように、TextRenderer クラスの MeasureText メソッドが使えます。
    印刷時には MeasureCharacterRanges が使えます。

    サンプル:新規プロジェクトの Form1 コンストラクタを置換
    public Form1()
    {
        InitializeComponent();

        FlowLayoutPanel flp = new FlowLayoutPanel();
        flp.FlowDirection = FlowDirection.TopDown;
        flp.Dock = DockStyle.Fill;
        flp.Parent = this;

        for (int i = 0; i < 10; i++)
        {
            TextBox tb = new TextBox();
            tb.Font = new Font("MS ゴシック", i * 2 + 9);
            tb.MaxLength = i * 5 + 1;
            tb.Text = tb.MaxLength.ToString();
            tb.Width = TextRenderer.MeasureText(
                new string('あ', tb.MaxLength), tb.Font).Width;
            tb.Parent = flp;
        }

        this.WindowState = FormWindowState.Maximized;
    }

     


    #追記:TextRenderer は Framework2.0 で追加されたものでした。1.x 環境でしたら MeasureCharacterRanges を使ってみてください。

    #さらに追記:文字数になっていなかった点を修正。それと文章1行削除
    2007年6月4日 11:34
  • えムナウ様、度々お世話になっております。
    質問の表現が間違っておりました・・・。
    何文字分ではなく、何バイト分です。

    MaxLengthを50にすれば、最大50バイト分の幅という意味でした。
    2007年6月5日 6:59
  • TH01様、ご教授ありがとうございます。
    頂きましたサンプルのように
    TextRenderer.MeasureText
    を使用し無事目的が達成できました。
    本当にありがとうございました。
    2007年6月5日 7:01