QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

TextBox コントロールの入力文字数をバイト数で制限

件名の通り、TextBox コントロールの入力文字数をバイト数で制限する
方法がわからなくて困っております。

TextBox の MaxLength では、バイト数ではなく、あくまでも文字数での制限と
なってしまうのですが、これをバイト数で入力可能な文字数を制限したいと
思っています。

何かよい方法はないでしょうか? よろしくお願いします。

質問者:うむむ

回答

速攻ですみません。環境を書き忘れました。

開発言語は C# です。(Visual Studio .NET 2003 を使用しています。)

それではよろしくお願い致します。

投稿者:うむむ

編集 履歴 (0)

Webアプリですか?Windowsアプリですか?

#追記
.NETはUNICODEなのでバイト単位ではなく文字数で判断しています。
なので、イベントでチェックさせるしかないようです。

「C#.NET バイト 入力 制限 テキストボックス」で検索してみました。
参考になれば幸いです。
http://groups.yahoo.co.jp/group/dotnet-csharp/message/357


まゆりん@絶賛勉強中<基本情報処理

[ メッセージ編集済み 編集者: まゆりん 編集日時 2004-03-25 21:01 ]

投稿者:まゆりん

編集 履歴 (0)

C#かどうかよりも、TextBoxというのがどっちのTextBoxなのか知りたいですね。2つありますから。
(話からSystem.Windows.Forms.TextBoxだと推察はできますが)

あと、まゆりんさんのリンク先にも書いてありますが、バイト数で制限したいならその半分の値をMaxLengthに設定すれば良いです。UTF-16なら

おそらくShift-JISで何バイトなのかということをおっしゃりたいのだと思いますが、Shift-JISは、今日ではもはやWindows環境で「特に断らなければこれに決まってる」と言えるようなものではありません。
全角半角などという概念も、もはや古臭いものです。
確かに現在でも意識しなければならない時は多いですが、過去の概念だという意識を持ちながら接してみてください。

ある条件で入力された文字を消すサンプルです。
長い文字列をコピペされても使えます。(多分)



private void textBox1_TextChanged(object sender, System.EventArgs e)
{
  this.textBox1.TextChanged -= new System.EventHandler(this.textBox1_TextChanged);

  while(長さの判定)
  {
    int curPoint=textBox1.SelectionStart-1;
    if(curPoint<0)curPoint=0;
    textBox1.Text=textBox1.Text.Remove(curPoint,1);
    textBox1.SelectionStart=curPoint;
  }

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

バイト数についてはEncodingクラスの静的メソッドGetEncoding()で
Encoding.GetEncoding("shift-jis")
などとやるとEncodingオブジェクトが取得できますのでGetByteCount()とかでバイト数がとれるんじゃないでしょうか。

それを使った判定を「長さの判定」の部分に入れてください。

投稿者:一郎

編集 履歴 (0)

お返事ありがとうございます。 TextBox は System.Windows.Forms.TextBox です。
すみません。

で、なぜ、バイト数で制限したいか、をお話したほうがより適切なアドバイスを
頂けそうなので、お付き合いくださると幸せです。

今回行ないたい事は、
TextBox に入力された値を、SQL Server に Insert するのですが、
その SQL Server 側のフィールドが varchar(20) のようになっています。

SQL Server の varchar(20) の 20 は、20文字ではなく、20バイトになるので
それに合わせる為に C# で作成している Windows Forms アプリケーションの
TextBox に入力できる文字数を、文字の数ではなく、バイト数で行ないたかった
為です。TextBox に入力できた値は問題なく SQL Server に登録できるんだよ、
という事にしたいのです。

逆に SQL Server 側の varchar の定義が 20 バイトではなく、20文字
とできるのであれば、それでも構わないのですが。。。

アドバイス頂いたコードはこれから試してみます。ありがとうございます。

他にもアドバイスなどあれば、どんな事でも構わないので、
教えて頂けると助かります。

よろしくお願いします。

投稿者:うむむ

編集 履歴 (0)

mgrd18kさんの書き込み (2004-03-25 22:07) より:

逆に SQL Server 側の varchar の定義が 20 バイトではなく、20文字

とできるのであれば、それでも構わないのですが。。。

nvarcharにする…てまあ、そういう問題じゃないですよね…

投稿者:なちゃ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。