Visual Basic クラスライブラリ詳解
VB.NET 2002 対応 VB.NET 2003 対応 VB2005 対応

 

Visual Basic 中学校 > クラスライブラリ詳解 > System > Windows > Forms >

TextBox

完全限定名 System.Windows.Forms.TextBox
基底クラス System.Object > System.MarshalByRefObject > System.ComponentModel.Component > System.Windows.Forms.Control > System.Windows.Forms.TextBoxBase
インターフェイス IBindableComponent, IComponent, IDisposable, IDropTarget, ISyncronizeInvoke, IWin32Window
派生クラス System.Windows.Forms.DataGridTextBox, System.Windows.Forms.DataGridViewTextBoxEditingControl
使用頻度 A
バージョン .NET Framework 1.0以上 (VB.NET2002以上)
主な機能 ユーザーに文字列を入力させる。

 

1.概要

 

TextBoxクラスは文字を入力、表示するためのコントロールです。通常はFormなどのコンテナに貼り付けて使用します。コントロールであるので、TextBoxクラスというよりもTextBoxコントロールと呼ばれることが多いです。

■画像1:TextBox

TextBoxでの文字の入力・表示は最もシンプルな形式で行われます。小さなメモ帳と考えてもよいでしょう。制御も簡単に行えるようになっているので、ユーザーが文字を入力する必要がある場合にはTextBoxを使用するのが一般的です。

フォントの種類や色・大きさを指定することもできますが、このような設定はTextBox全体に適用され、文字の一部分だけ赤くするといったことはできません。このようなワープロ的な装飾が必要な場合はTextBoxではなくRichTextBoxを使用します。

また、単に文字を表示するだけならばLabelを使用するのが一般的です。Labelでは文字の入力・編集は行えません。TextBoxを使用してもReadOnlyプロパティをTrueにすることで読み取り専用にすることは可能です。

メモ メモ  -  TextBoxに似たコントロール

上述のようにTextBoxはシンプルな入力を行うコントロールです。ここではTextBoxに似た機能を持つコントロールを紹介しますのでTextBoxでは難しい仕様を実現しようとしている場合に検討してみてください。

RichTextBox ワープロのように部分的に文字の色やフォントなどの形状を変更して入力できる。ただし、その制御は少し難しい。
MaskedTextBox 日付や郵便番号のような書式付きの入力ができる。
Label 表示のみ。TextBoxよりも細かい表示設定ができる。
WebBrowser VB2005以降。ほとんどの場合表示のみ。かなり詳細な表示設定ができる。制御は少し難しい。

■表1:TextBoxに似たコントロール

なお、私は書式付きの入力というものが個人的に好きではないためMaskedTextBoxはまず使用しません。このような場合にはTextBoxを使用します。そしてユーザーは自由な入力が可能で、入力後に整形を行うというスタンスを採っています。

 

2.文字の制御

 

2−1.文字列の設定と取得

TextBoxに表示される文字はTextプロパティで制御されます。

Textプロパティに文字列をセットするにはデザイン時にプロパティウィンドウを使用してTextプロパティを編集するか、実行時にユーザーがキーボードなどの入力装置を使用して文字を入力するか、コードを記述してプログラムから制御するかします。

プロパティウィンドウではTextプロパティ欄に自由に文字列を入力できますし、下向きの矢印をクリックしてプロパティ欄を展開することで複数行にわたる文字列を入力することができます。

■画像2:プロパティウィンドウを使用してTextプロパティをセット

ただし、実際に複数行で文字列を表示するためにはMultiLineプロパティにTrueをセットする必要があります。そうでない場合、何行入力してもすべて1行で表示されてしまいます。MultiLineプロパティはプロパティウィンドウやプログラムから設定することもできますが、VB2005以降であればTextBoxのスマートタグを使用して設定するのが最も簡単です。

TextBoxのスマートタグを表示するにはTextBoxを選択した状態で右上に表示される小さな三角形のボタンをクリックします。

■画像3:スマートタグを使用してMultiLineプロパティをセット

プログラムでTextプロパティを使用する方法は通常のプロパティと同じです。

次の例ではTextBox1に「こんにちは」と表示します。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text =
"こんにちは"
 

■リスト1:Textプロパティのセット

次の例ではTextBox1に現在表示されている内容を取得します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim Value As String

Value = TextBox1.Text

■リスト2:Textプロパティの取得

 

2−2.読み取り専用と使用不可と背景色

ReadOnlyプロパティをTrueにすることでTextBoxを読み取り専用にすることができます。この状態ではプログラムからのTextプロパティの変更は可能ですがユーザーが入力装置を使って文字列を編集することができなくなります。ただし、文字列の内容を変更しない操作なら可能で、たとえばマウスを使って文字列の全体や一部分を選択したり、選択した部分をコピーしたりできます。

EnabledプロパティをFalseにしてTextBoxを使用不可にした場合でも同じようなことが起こりますが、このときはマウスによる文字列の選択やコピーもできなくなります。

ReadOnlyプロパティやEnabledプロパティを変更するとTextBoxの背景色と文字の色が自動的に灰色のような色に変更され、デザイン性を重視するアプリケーションを開発する場合に好ましくない場合があります。

→実際に何色になるかはWindowsのコントロールパネルの設定により異なります。ここでは標準的な設定に基づいて説明しています。

  ReadOnly = True Enabled = False
効果 読み取り専用 使用不可
文字列の編集 × ×
文字列の選択・コピー ×
背景の色 灰色 灰色
文字の色 灰色
背景の色の変更
文字の色の変更 ×

■表2:ReadOnlyEnabledの違い

しかしながら、背景色についてはBackColorプロパティを変更するだけで簡単に変えることができます。

次の例では背景色が白い状態でTextBoxを読み取り専用にします。

VB.NET2002対応 VB.NET2003対応 VB2005対応

TextBox1.ReadOnly = True
TextBox1.BackColor = Color.White

■リスト3:読み取り専用で背景色を白

実際にはコントロールパネルの設定次第で標準の色が白ではない可能性もあります。ですから、次の例のようにシステムで設定されている色をそのままセットする方が柔軟性があります。

VB.NET2002対応 VB.NET2003対応 VB2005対応

TextBox1.ReadOnly = True
TextBox1.BackColor = Color.FromKnownColor(KnownColor.Window)

■リスト4:読み取り専用で背景色をシステムの既定の色(通常は白)

この設定はプロパティウィンドウだけでも行うことができますが、どのような場合でもまずReadOnlyプロパティやEnabledプロパティを変更して、その後でBackColorプロパティを指定しなければ意味がありません。

文字の色に関してはReadOnly = Trueの場合にはForeColorプロパティを使用して簡単に変えることができます。しかし、Enabled = Falseの場合には文字の色を変更することはできません。

どうしてもEnabled = Falseの状態で文字の色を変更したい場合はTextBoxコントロールを継承した自作のコントロールを作成することになります。

 

3.さまざまな表示方法

 

3−1.複数行の表示

はじめの状態ではTextBoxには1行分の文字列しか入力・表示することができません。複数行にわたる文字列を入力・表示できるようにするためにはMultiLineプロパティをTrueにすることが必要です。また、必要に応じてTextBoxの高さを調節します。

プログラムからの制御で複数行の文字列をセットするには改行位置に改行コードを挿入します。VBでは改行コードは定数vbNewLineによって定義されています。

次の例では2行にわたって「リキニウス」「セクスティウス」と表示します。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text = "リキニウス" & vbNewLine &
"セクスティウス"
 

■リスト5:複数行のTextをセット

 

3−2.文字列の折り返し

TextBoxの幅が十分にない時は1行分の文字列が折り返されて表示されます。この動作はWordWrapプロパティで変更できます。

既定ではWordWrapプロパティはTrueになっていてTextBoxの幅が十分でないときは内容が自動的に折り返されます。

■画像4:WordWrapによる自動折り返し

WordWrapプロパティをFalseにすると自動折り返しは無効になります。

■画像5:WordWrap = False

この場合はTextBoxの幅が足りない分は表示されませんが、マウスで選択したりキーボードの矢印などでカーソルを移動させればスクロールして表示・編集することができます。

 

3−3.スクロールバー

TextBoxでは文字列が表示しきれないときに自動的にスクロールバーを表示する機能があります。このスクロールバーはツールボックスのスクロールバーコントロールとは異なり、完全にTextBoxに従属するもので制御も自動的に行われます。

■画像6:スクロールバー

スクロールバーには縦にスクロールする垂直スクロールバーと横にスクロールする水平スクロールバーの2種類があります。どちらのスクロールバーを表示するかはScrollBarsプロパティで指定できます。

意味
列挙体の値 None スクロールバーを表示しません。
列挙体の値 Horizontal 横にスクロールする水平スクロールバーを表示します。
列挙体の値 Vertical 縦にスクロールする垂直スクロールバーを表示します。
列挙体の値 Both 両方のスクロールバーを表示します。

■表3:ScrollBarsプロパティの設定内容

WordWrapプロパティがTrueの場合は、横にスクロールする必要がないためScrollBarsプロパティをどのような値にしても水平スクロールバーは表示されません。

 

3−4.”の表示

プログラムからTextBoxに「"」(ダブルクォーテーション)を含む文字列を表示させるには、VBで通常"を文字として扱う場合と同様に"を2つ重ねて""にします。

以下の例はTextBoxに「アメリカ人の転校生が"How do you do?"と言いました。」と表示されます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text =
"アメリカ人の転校生が""How do you do?""と言いました。"
 

■リスト6:"の表示

"」を1つだけを表示させる場合は次のようにします。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text =
""""
 

■リスト7:「"」を1つだけを表示

 

3−5.文字の右寄せ・左寄せ・中央寄せ

TextAlignプロパティを使用すると文字列の表示を右寄せ、左寄せ、中央寄せにすることができます。

意味
列挙体の値 Left 左寄せ
列挙体の値 Right 右寄せ
列挙体の値 Center 中央寄せ

■表4:TextAlignプロパティの設定内容

 

4.テキストの操作

 

4−1.文字列の前または後ろに文字列を追加する

TextBoxではプログラムから文字列を編集するためのいくつかの便利なメソッド・プロパティが提供されています。しかし、標準的な操作であればTextプロパティを使用するのがわかりやすいです。また、標準ではサポートされていないような複雑な操作を実現する場合にも最終的にはTextプロパティを使用して文字列を細かく見ていくことになります。

ここではシンプルな例を紹介します。

次の例は現在表示されている文字列の前に文字列を追加します。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text = "挿入しました" & TextBox1.Text
 

■リスト8:文字列の前に挿入

次の例では現在表示されている文字列の後ろに文字列を追加します。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text = TextBox1.Text &
"と彼女は言った。"
 

■リスト9:文字列の後ろに追加

この例は &= 演算子を使用して次のように書くのが一般的です。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Text &=
"と彼女は言った。"
 

■リスト10:&= 演算子の使用

また、AppendTextメソッドでも後ろに文字列を追加することができます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.AppendText("と彼女は言った。")
 

■リスト11:AppendTextメソッドの使用

 

4−2.文字列の選択の制御

ユーザーはマウスなどを使用して文字列の一部または全部を選択することができます。文字列の選択はプログラムで制御することもできます。

また、当然プログラムでは現在選択されている内容を取得することができます。

文字列の選択に関係するTextBoxのメソッド・プロパティは次の通りです。

メソッド・プロパティ 説明
プロパティ HideSelection フォーカスがないときにも選択されている文字列を反転表示させるか。
プロパティ SelectedText 選択されている文字列を表します。
プロパティ SelectionLength 選択されている文字数を表します。
プロパティ SelectionStart 選択開始位置を表します。
メソッド DeselectAll 文字列の選択を解除します。
メソッド Select 開始位置と文字数を指定して文字列を選択します。
メソッド SelectAll すべての文字列を選択します。

■表5:文字列の選択に関係するメソッド・プロパティ

実際の選択内容とプロパティの関係を図にすると次のようになります。

■画像7:Textの選択とプロパティの関係

.NET Frameworkの標準では文字の位置は0から始まるので、上の図では5文字目の「故」から選択が始まっているのがSelectionStart = 4となります。SelectionLengthは選択されている文字数を表しているので「故に我」だと3になります。

SelectedTextプロパティはそのまま選択されている文字の内容を表しているので、上記の図の場合SelectedTextプロパティの値は「故に我」です。

プログラムで選択内容を設定するにはSelectメソッドやSelectAllメソッドを使用します。

SelectAllメソッドはTextBox内のすべての文字列を選択します。引数もないので使用は簡単です。

Selectメソッドには2つの機能があります。1つはTextBoxにフォーカスを移す機能です。Selectメソッドを引数なしで呼び出した場合にはこの機能が動作します。この機能はここでの説明とは関係ありません。もう1つがTextBoxの文字列の一部または全部を選択する機能です。このときは引数に選択開始位置と選択文字数を指定します。

次の例では「故に我」が選択状態になります。

VB.NET2002対応 VB.NET2003対応 VB2005対応

TextBox1.Text = "我思う、故に我あり。"
TextBox1.Select(4, 3)
TextBox1.Focus()

■リスト12:文字列の一部を選択

この例で、最後の行のTextBox1.Focusは必須ではありませんが、これがないと結果がわかりにくくなります。文字列の選択が強調表示されるのはそのコントロールにフォーカスがある時だからです。いくらSelectしてもそのコントロールにフォーカスがないと見た目は変わりません。TABキーなどでフォーカスを移動したときに初めて選択されている内容が反転して表示されるのです。

HideSelectionプロパティを使うとこの動作を変更することができます。HideSelection = Falseに設定すると、フォーカスがないときでも選択されている内容が強調表示されます。

 

文字列の選択をすべて解除するにはDeselectAllメソッドを使用します。

VB2005対応


TextBox1.DeselectAll()
 

■リスト13・文字列の選択をすべて解除

このメソッドはVB2005以降でのみ使用可能です。

SelectionLengthに0をセットすることで選択を解除することもでき、この方法はすべてのバージョンで利用できます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.SelectionLength = 0
 

■リスト14:文字列の選択をすべて解除

 

なお、SelectionStartプロパティは文字列の選択とは関係なくTextBox内のキャレット(カーソル)の位置を指定する役割もあります。

 

4−3.複数行の制御

複数行にわたる文字列の指定した行だけを処理するにはLinesプロパティを使用するのが最も簡単です。

次の例ではButton1をクリックするとTextBox1に長い文字列を複数行にわたってセットします。Button2をクリックするとその3行目だけを取り出して表示します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim
St As
String

   
St = "籠もよ み籠持ち ふくしもよ みぶくし持ち" & vbNewLine
    St &= "この丘に 菜摘ます児 家聞かな 名告らさね" & vbNewLine
    St &= "そらみつ やまとの国は" & vbNewLine
    St &= "おしなべて 吾こそをれ" & vbNewLine
    St &= "しきなべて 吾こそませ" & vbNewLine
    St &=
"我こそは 告らめ 家をも 名をも"

   
TextBox1.Text = St

End
Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim
St As
String

   
St = TextBox1.Lines(2)

    MsgBox(St)

End
Sub

■リスト15:複数行のTextから3行目を取得

Linesプロパティは行の配列です。配列は0からはじまるため3行目を指定するにはLines(2)とします。この例ではButton1をクリックしてからButton2をクリックすると「そらみつ やまとの国は」と表示されます。

■画像8:複数行にわたるTextBox

この長歌は万葉集の一番最初に載っている和歌で、雄略天皇が詠んだものであるという伝説があります。

Linesプロパティは単なる配列なので存在しない行を指定すると例外IndexOutOfRangeExceptionが発生します。

Linesプロパティは読み取りだけではなく値の設定も可能です。ただし、Linesプロパティの個々の要素はTextBoxの各行のコピーにすぎないのでTextBox1.Lines(2) = "こんにちは"のようにしても何も置きません。

Linesプロパティを使用して文字列を置き換えるには、Linesプロパティが表している配列ごと置き換える必要があります。

次の例では3行目を改変します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim NewLines() As String

NewLines = TextBox1.Lines
NewLines(2) =
"これが3行目"
TextBox1.Lines = NewLines

■リスト16:複数行のTextの3行目だけを変更

Linesプロパティを使用して何もないところに行を追加することもできます。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim NewLines(5) As String

NewLines(0) = "籠もよ み籠持ち ふくしもよ みぶくし持ち"
NewLines(1) = "この丘に 菜摘ます児 家聞かな 名告らさね"
NewLines(2) = "そらみつ やまとの国は"
NewLines(3) = "おしなべて 吾こそをれ"
NewLines(4) = "しきなべて 吾こそませ"
NewLines(5) = "我こそは 告らめ 家をも 名をも"

TextBox1.Lines = NewLines

■リスト17:複数行のTextをセット

このようにするとvbNewLineなどの改行コードで結合しないで複数行の文字列をセットすることができます。

当然、文字列の配列であればなんでもLinesプロパティに設定することができますからいろいろな内容を簡単にTextBoxに表示することができます。

たとえば、EnvironmentクラスのGetLogicalDrivesプロパティはコンピュータのドライブの一覧を示すプロパティで文字列型の配列ですから、次のようにするとTextBoxにドライブの一覧を表示させることができます。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Lines = Environment.GetLogicalDrives
 

■リスト18:Linesプロパティの用例

ただし、一覧で表示させる場合はListBoxコントロールを使用した方が便利であることが多いので、このようなTextBoxの使用は少ないでしょう。

 

5.入力の制御・チェック

 

5−1.キーストロークの取り消し

TextBoxのイベントを使用するとユーザーの入力を細かく制御することができます。

最もよく使用するのはKeyPressイベントです。KeyPressイベントはユーザーが文字を入力したときに発生します。KeyPressイベントの引数を使用するとユーザーが何を入力しようとしているのかがわかり、それに対する反応を記述することができます。

次の例ではユーザーは0〜9の数字しか入力できなくなります。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

    If
Not (e.KeyChar Like "[0-9]")
Then
       
e.Handled = True
   
End If

End Sub

■リスト19:0〜9の数字のみ入力可能

条件部分はIf e.KeyChar <> "0" AndAlso e.KeyChar <> "1" AndAlso ...と続けて書いても同じですが、プログラムが無駄に長くなるのでLile演算子を使用して簡略化しました。KeyPressイベントではLike演算子が必須ということではありません。

e.Handlesプロパティはそのキーが処理済みであることを示します。つまり、文字が0〜9以外のものであった場合には、本当は何も処理していないにも関わらずe.Handled = Trueをセットして処理済みであることにしてしまいます。これによって結果として何も入力されなくなります。この理屈がわかりにくい場合はe.Handled = Trueとすると入力がキャンセルできるんだと理解してもよいでしょう。

入力しようとしている文字が0〜9のどれかである場合はここでは特に何も記述していないのでシステムが自動的に制御します。つまり、通常通り1を入力すれば1と表示されるし、2を入力すれば2と表示されます。

この例は一見シンプルで便利そうに見えますが考慮しなければいけないことがあります。スペースキーやEnterキー、BackSpaceキーもKeyPressイベントによって処理されるため、0〜9のみを許可ということにするとBackSpaceが使えなくなってしまうのです。

また、Deleteキーの方はKeyPressイベントでは処理されないため常に使用できることになります。

このあたりの事情については初級講座第21回 マウス・キーボードからの入力で説明していますので参照してください。

基本的にはTextBoxの細かい入力制御は可能ではありますが、いろいろな事情によってプログラムがかなり複雑になりますのでどうしても必要でない限りやらない方がよいでしょう。

TextBoxでは何でも好きなように入力できるようにしておいて、最後の決定的なタイミングで入力内容が妥当かどうかチェックするのがVBにふさわしいスタンスです。KeyPressイベントなどを使用して逐一入力内容を制御しようとする場合は通常の3倍以上の作業量が必要であることを覚悟しておいてください。3倍というのは私の経験によります。

 

5−2.TextBoxの入力チェック

Wndowsフォームでの入力チェックはコントロールの種類によらず一番最後の決定的なタイミングで一括して行うのがベストです。一番最後の決定的なタイミングとはOKボタンや保存ボタンなど入力内容を確定させるタイミングのことを指しています。

どうしても入力するタイミングでチェックを行いたい場合はValidationイベントを使用するのが一般的です。

入力チェックについては初級講座第23回 コントロールの遷移制御で説明していますので参考にしてください。

 

Modifiedプロパティを使用するとユーザーによってTextBoxの入力内容が変更されているか調べることがわかるので、無駄なチェックを行わないで済みます。

次の例ではユーザーがTextBoxの内容を変更したかを判断します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

If TextBox1.Modified Then
    MsgBox("変更されています。")
End
If

■リスト20:Text変更を検出

ModifiedプロパティはプログラムからTextプロパティやLinesプロパティなどで文字列を変更しても反応しません。ユーザーによる変更のみに反応します。Modifiedプロパティには自由に値をセットできるので、プログラムからこの値を制御する場合もあります。

たとえば、一度ユーザーが文字列を変更してから保存ボタンを押したときのことを考えます。文字列を変更してから保存されるまでの間は文字列をチェックする必要が考えられるのでModifiedプロパティはTrueであることが期待されます。実際にこの状況では自動的にModifiedプロパティはTrueになります。

しかし、保存後は一度入力の検証が完了しているのですからModifiedプロパティはFalseに戻したいところです。この制御は自動では行われないため、プログラム中でModifiedプロパティの値を書き換える必要があります。

このようにしておけば、保存後に再度ユーザーが文字列を変更して保存を繰り返した場合にまたModifiedプロパティを使ってその文字列をチェックする必要があるのか判断することができます。

 

5−3.改行とタブの入力

初期状態のTextBoxでは改行やタブを入力することはできませんが、プロパティの設定によって入力することが可能になります。

改行を入力できる条件は次の通りです。

・複数行対応である。(MultiLine = True)

AcceptsReturn = Trueであるかフォームの既定のボタン(AcceptButton)が設定されていない。

フォームに既定のボタンが設定されている場合は改行のつもりでEnterキーを押してもそのボタンのイベントの方が優先で発生していしまいます。AcceptsReturnプロパティがTrueの場合には、改行コードの入力の方が優先されます。

タブを入力できる条件はAcceptsTagTrueにすることです。

 

6.オートコンプリート

 

VB2005以降ではTextBoxにオートコンプリート機能が追加されました。この機能を使用すると文字列の一部分を入力しただけで入力候補が表示され素早い入力が可能になります。しかも、簡単なプロパティの設定だけですぐこの機能を使用することができてたいへん便利です。

■画像9:オートコンプリートの作動

ただし、複数行入力が可能なTextBoxではオートコンプリート機能は利用できません。

オートコンプリート機能は次のプロパティを使用して制御します。

メソッド・プロパティ 説明
プロパティ AutoCompleteCustomSource AutoCompleteModeがCustomSourceの場合の入力候補の一覧を示します。
プロパティ AutoCompleteMode オートコンプリートの動作方法を示します。
プロパティ AutoCompleteSource 入力候補の一覧を示します。

■表6:オートコンプリートに関係するメソッドとプロパティ

オートコンプリートを有効にするには、まずAutoCompleteModeプロパティでモードを指定します。初期設定ではNone、つまりオートコンプリートなしが設定されています。

説明
列挙体の値 None オートコンプリートを無効にします。
列挙体の値 Suggest 提案モードでオートコンプリートを有効にします。
列挙体の値 Append 追加モードでオートコンプリートを有効にします。
列挙体の値 SuggestAppend 提案モードと追加モードの両方でオートコンプリートを有効にします。

■表7:AutoCompleteModeプロパティの設定内容

オートコンプリートには追加モード(Append)と提案モード(Suggest)があります。追加モードでは途中まで文字を入力した時点で最も可能性の高い入力候補が自動的にTextBoxに表示されます。ユーザーはそこで入力を中止して候補を確定することもできますし、そのまま入力を続けてさらに候補を絞り込んだり、候補にない文字列を入力することができます。

提案モードでは途中まで文字を入力した時点でコンボボックスのようなドロップダウンリストが表示されてユーザーはリストの中から目的の文字列を選択することもできますし、そのまま入力を続けてさらに候補を絞り込んだり、候補にない文字列を入力することができます。

入力候補の一覧を指定するにはAutoCompleteSourceプロパティを使用します。自由に入力候補の一覧を作成することもできますが、あらかじめ用意されている一覧を使用しても便利です。

説明
列挙体の値 FileSystem コンピュータのファイル・フォルダのパスを入力候補にします。
列挙体の値 HistoryList インターネットのURLの履歴を入力候補にします。
列挙体の値 RecentlyUsedList 最近使用したURLの履歴を入力候補にします。
列挙体の値 AllUrl HistoryListとRecentlyUsedListの両方を入力候補にします。
列挙体の値 AllSystemSources FileSystemとAllUrlの両方を入力候補にします。
列挙体の値 FileSystemDirectories コンピュータのフォルダのパスを入力候補にします。
列挙体の値 CustomSource AutoCompleteCustomSourceプロパティの内容を入力候補にします。
列挙体の値 None オートコンプリート機能を使用しません。

■表8:AutoCompleteSourceの設定内容

 

一例を示すとAutoCompleteModeSuggestにして、AutoCompleteSourceFileSystemにしたTextBoxでは数文字を入力するとそれに続くファイル・フォルダの一覧が自動的に表示されて非常に便利です。

この状態のときはパスの区切り記号の「\」を入力したタイミングで新しい候補が表示されます。

自由に入力候補の一覧を編集するにはAutoCompleteSourceCustomSourceにしてから、AutoCompleteCustomSourceプロパティに入力候補の一覧を設定します。

AutoCompleteCustomSourceプロパティにはプロパティウィンドウを使用して値をセットすることもできますし、プログラムから値をセットすることもできます。

プロパティウィンドウを使用する場合は、ほかのプロパティでもしばしば登場する文字列コレクションエディタを使用します。

■画像10:入力候補の編集

プログラムから設定する場合は次のようになります。

VB2005対応

Dim List As New AutoCompleteStringCollection

List.Add("イーシー・ドバール錠")
List.Add("イージブラスタ")
List.Add("イータップS錠「イセイ」")
List.Add("イエスタミン細粒")
List.Add("イオウ")
List.Add("イオダインM液")
List.Add("イオダインガーグル液")
List.Add("イカルス")
List.Add("イクロール錠")
List.Add("イコナゾンカプセル")
List.Add("イコナゾンカプセル")

TextBox2.AutoCompleteCustomSource = List

■リスト21:カスタム入力候補の作成

データベースやファイルから入力候補を読み込むなどすれば十分に柔軟性の高い運用が可能になります。

■画像11:カスタム入力候補による提案モードの作動

なお、IMEを使用した入力の場合はIMEで確定後にオートコンプリートが動作するのでオートコンプリートのありがたみはあまりありません。

 

7.データ連結

 

TextBoxは他のコントロールと同様の方法でデータ連結を設定できます。

データ連結についてはデータベース講座第6回 コントロールのデータ連結を参考にしてください。

 

8.その他の機能

 

8−1.パスワード

よく何かのログイン画面で見かけるようなパスワード入力用にTextBoxを構成することができます。

■画像12:パスワード入力

PasswordCharプロパティはこの用途でTextBoxに表示する文字を指定します。PasswordCharプロパティに何か設定した場合にはユーザーが何を入力してもその設定した文字しか表示されません。たとえば、「*」や「●」が使用されているケースが多いようです。

システムで設定されている値を採用するにはUseSystemPasswordCharプロパティをTrueにします。通常はPasswordCharプロパティを個別に設定するのではなく、このUseSystemPasswordCharプロパティをTrueに設定するだけで十分です。

なお、ユーザーから隠蔽されるのは表示だけで、プログラム内部でTextプロパティなどを使って取得する文字列は通常通りです。パスワード設定によってプログラムを変更する必要は一切ありません。

同様の理由でこのパスワード機能は人間の目からパスワードを隠蔽することができますが、コンピュータの目からは丸見えです。そのためごく簡単なハッキングソフトを作成して入力内容を取得することができてしまいます。たとえば、MicrosotのSpy++を使ってパスワードが取得できることが確認できます。

ですから、この機能を過信して重要な情報をパスワード文字で表示してはいけません。

なお、何年か前にテレビや雑誌で話題となったパスワードをのぞき見するソフトというのはこの機能の性質を使用しているだけで特にセキュリティ上脅威になるようなものではありません。何も知らない一般人は「*」や「●」などのパスワード文字で表示している内容が、ほかのソフトを使って取得できてしまうことに驚いてしまうようです。

 

8−2.カーソル位置の制御

テキスト入力のカーソル(キャレット)の位置はSelectionStartプロパティで制御できます。ですから、フォーカスを取得したときにカーソルを先頭に移動することも末尾に移動することも可能です。

次の例ではフォーカスを取得したときにカーソルを文字列の末尾に移動します。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter

    TextBox1.SelectionStart = Len(TextBox1.Text)

End
Sub

■リスト22:カーソル位置を末尾に移動

 

8−3.最大文字数

MaxLengthプロパティを使用するとユーザーが入力可能な最大文字数を指定できます。ユーザーはこの文字数を超えてTextBoxに文字列を入力することはできません。

ただし、この文字数はあくまでもユーザーが入力可能な文字数であってプログラムからはMaxLengthを超える長さの文字列をセットすることが可能です。また、設定値は文字数であってバイト数でない点にも注意が必要です。

最大文字数を指定しない場合はMaxLengthには0をセットします。0をセットした場合の最大文字数は環境によって異なりますがほとんどの環境であ2GB文の文字列かメモリの限界かのどちらかになります。既定値は32767です。

 

8−4.コピー&貼り付け

Windowsでのテキスト編集でよく使用するコピー、貼り付けなどもメソッドとして簡単に扱えるようになっています。

これらのメソッド・プロパティは引数なしで簡単に扱えます。

メソッド・プロパティ 説明
プロパティ CanUndo Undo操作が可能であるか調べます。
メソッド Clear TextBoxの文字列をすべて削除します。
メソッド Copy 現在選択されている内容をクリップボードにコピーします。
メソッド Cut 現在選択されている内容を切り取ってクリップボードにコピーします。
メソッド Paste クリップボードの内容をキャレットの位置に挿入します。
メソッド Undo 直前の操作を取り消します。

■表9:テキスト編集でよく登場する機能に関係するメソッド・プロパティ

次の例はTextBoxの現在選択されている内容をクリップボードにコピーします。

VB.NET2002対応 VB.NET2003対応 VB2005対応


TextBox1.Copy()
 

■リスト23:現在選択されている内容をクリップボードにコピー

 

 

A.附録.TextBoxのよくあるタスク

A-1.テキストファイルを読み込んで表示する

A-2.TextBoxの内容をテキストファイルに書き込む

A-3.フォーカス取得時に文字列をすべて選択する

A-4.全角文字の入力をエラーにする

A-5.数字以外の入力をエラーにする