|
分類:[C#]
毎度お世話になっております。
TextBoxに文字が入力された時orリサイズされた時に
内容に合わせてTextBoxの高さを変更したいと思っています。
ひとまず、以下のソースでうまく動いているかのように
思えるのですが、例えば
・AAAA:000000000001
・BBB:へのへのもへじ
と言ったデータがあった場合、
┏━━━━━━━━━━━┓
┃AAAA:000000000001┃
┃BBB:へのへのもへ ┃
┃じ ┃
┗━━━━━━━━━━━┛
と、 なるような場合があると思います。
(ほぼ同じ長さなのに・・・)
半角・全角が混じった時に単語単位等で
折り返しされたりされなかったりとで、
基準が良くわからず、数値上では、一行の長さがクライアント
領域幅を超えているのに、実際表示すると
WordWrapされていない等の事象が発生してしまいます。
どのようにすれば正しく計算できてサイズを
調整出来るのか教えて頂けませんか?
------------------------------
private void ResizeTextBox(object sender, EventArgs e)
{
Size strSize;
int tbWidth = 0; // TextBoxのクライアント領域幅
int lineHeight = 0; // 一行高さ
// 引数チェック
TextBox tb = sender as TextBox;
if (tb == null) return;
// テキストボックスのクライアント領域の幅を取得
tbWidth = tb.ClientSize.Width;
// 基本の行数を取得
int baseLines = tb.Lines.Length;
// 改行で分割
string[] lines = tb.Text.Replace("\r\n", "\n").Split('\n');
foreach (string strLine in lines)
{
// 一行の縦横サイズを求める
// フォントはMSUIGothic 12pt
strSize = TextRenderer.MeasureText(strLine, tb.Font);
// 一行の高さを求める。(初回のみ)
if (lineHeight == 0) lineHeight = strSize.Height + 1; // +1は行間分微調整
// もしTextBoxのクライアント領域幅より文字列の方が長い場合は、
// WordWrapで改行されているので、何行改行されているのか
// 調べる。
if (tbWidth < sf.Width)
{
int nLine = strSize.Width / tbWidth; // 行数
int nMod = strSize.Width % tbWidth; // 余り
baseLines += (nLine - 1); // 追加行数をセット
// 余りがある場合は1行プラス
if (0 < nMod) baseLines++;
}
}
// テキストボックスの高さを(行数*一行高さ)
// にセットする。
tb.Height = baseLines * lineHeight;
return;
}
どなたか良い手法or修正方法を教えて頂けると
幸いです。昨日に引き続き質問続きですが、
宜しくお願い致します。
環境はVS2005/C#/.net2.0です。
|