トップ回答者
テキストボックスの幅について

質問
-
いつもお世話になっております。
現在、テキストボックスのレイアウト幅を、入力可能文字数から動的に調整したいと思っております。
例えばMaxLengthプロパティが10であればジャスト10文字分、50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整したいのですがどうもうまくいきません。
下記のようにサイズを取得し、設定してもずれてしまいます。
String str;特にMaxLength値が多ければ多いほど、幅が足りなくなるようです。
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);
フォントはMS ゴシックを使用しています。
以上、ご教授お願いいたします。
回答
-
str = str.PadRight(this.textBox1.MaxLength, '8');
や
str = str.PadRight(this.textBox1.MaxLength, 'あ');
こうすると少しは良いかもしれません。
>50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整
MS ゴシックは固定長フォントですが全角半角文字によって横幅が違います。
MaxLengthは全角半角どちらも一文字ですので、
全角半角まじりでジャスト50文字分の横幅というのは存在しない数値です。
追記:若干誤解しました。
-
#投稿する直前にリロードしてみたら、えムナウさんに先を越されてた(^^;
フォーム上の場合は以下のように、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;
}
#さらに追記:文字数になっていなかった点を修正。それと文章1行削除
#追記:TextRenderer は Framework2.0 で追加されたものでした。1.x 環境でしたら MeasureCharacterRanges を使ってみてください。
すべての返信
-
str = str.PadRight(this.textBox1.MaxLength, '8');
や
str = str.PadRight(this.textBox1.MaxLength, 'あ');
こうすると少しは良いかもしれません。
>50であればジャスト50文字分といったように、MaxLengthプロパティの値によってコントロール幅を動的に調整
MS ゴシックは固定長フォントですが全角半角文字によって横幅が違います。
MaxLengthは全角半角どちらも一文字ですので、
全角半角まじりでジャスト50文字分の横幅というのは存在しない数値です。
追記:若干誤解しました。
-
#投稿する直前にリロードしてみたら、えムナウさんに先を越されてた(^^;
フォーム上の場合は以下のように、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;
}
#さらに追記:文字数になっていなかった点を修正。それと文章1行削除
#追記:TextRenderer は Framework2.0 で追加されたものでした。1.x 環境でしたら MeasureCharacterRanges を使ってみてください。