[C#] TextBox入力を検出するイベント(TextChanged)の使い方

C#でTextBoxの入力を検出するには、TextChangedイベントを使用します。

このイベントは、TextBoxのテキストが変更されるたびに発生します。

使用するには、まずTextBoxコントロールに対してTextChangedイベントハンドラを設定します。

例えば、Visual StudioのデザイナーでTextBoxを選択し、プロパティウィンドウのイベントタブからTextChangedをダブルクリックすると、自動的にイベントハンドラが生成されます。

コード内では、TextBox.TextChanged += new EventHandler(YourEventHandlerMethod);のように記述します。

イベントハンドラ内で、TextBox.Textプロパティを使用して現在のテキストを取得し、必要な処理を行います。

これにより、ユーザーがテキストを入力するたびにリアルタイムで反応することが可能です。

この記事でわかること
  • TextChangedイベントの基本的な使い方
  • イベントハンドラの設定と解除方法
  • リアルタイムでの入力検証の実装
  • 複数TextBoxの同期方法
  • 自動補完機能の実装例

目次から探す

TextBoxとTextChangedイベントの基本

C#のWindowsフォームアプリケーションにおいて、TextBoxはユーザーからの入力を受け取るための重要なコンポーネントです。

TextChangedイベントは、TextBoxの内容が変更された際に発生するイベントで、リアルタイムでの入力検証やUIの動的な変更に利用されます。

このイベントを活用することで、ユーザーの入力に応じた柔軟なアプリケーションを構築することが可能です。

TextChangedイベントは、ユーザーがテキストを入力するたびに発生するため、適切に実装することで、よりインタラクティブな体験を提供できます。

TextChangedイベントの実装方法

イベントハンドラの設定方法

TextChangedイベントを使用するには、まずTextBoxのインスタンスにイベントハンドラを設定する必要があります。

以下のコードは、MyFormクラス内でTextBoxのTextChangedイベントを設定する方法を示しています。

public partial class MyForm : Form
{
    private TextBox myTextBox;
    public MyForm()
    {
        InitializeComponent();
        myTextBox = new TextBox();
        myTextBox.TextChanged += MyTextBox_TextChanged; // イベントハンドラの設定
    }
    private void MyTextBox_TextChanged(object sender, EventArgs e)
    {
        // イベントハンドラの処理
    }
}

このコードでは、TextBoxのインスタンスmyTextBoxに対して、MyTextBox_TextChangedメソッドをイベントハンドラとして設定しています。

イベントハンドラ内でのテキスト取得

TextChangedイベントが発生した際に、イベントハンドラ内でTextBoxのテキストを取得することができます。

以下のコードは、テキストを取得し、コンソールに表示する例です。

private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string currentText = myTextBox.Text; // 現在のテキストを取得
    Console.WriteLine(currentText); // コンソールに表示
}

このように、myTextBox.Textを使用することで、ユーザーが入力したテキストをリアルタイムで取得できます。

イベントハンドラの解除方法

TextChangedイベントのハンドラを解除するには、-=演算子を使用します。

以下のコードは、フォームの破棄時にイベントハンドラを解除する方法を示しています。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        myTextBox.TextChanged -= MyTextBox_TextChanged; // イベントハンドラの解除
        myTextBox.Dispose(); // TextBoxのリソースを解放
    }
    base.Dispose(disposing);
}

このコードでは、Disposeメソッド内でイベントハンドラを解除し、リソースを適切に解放しています。

これにより、メモリリークを防ぐことができます。

TextChangedイベントの活用例

リアルタイムでの入力検証

TextChangedイベントを利用して、ユーザーが入力した内容をリアルタイムで検証することができます。

例えば、メールアドレスの形式をチェックする場合、以下のような実装が考えられます。

private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string inputText = myTextBox.Text; // 現在のテキストを取得
    bool isValidEmail = IsValidEmail(inputText); // メールアドレスの形式を検証
    if (isValidEmail)
    {
        // 有効なメールアドレスの場合の処理
        Console.WriteLine("有効なメールアドレスです。");
    }
    else
    {
        // 無効なメールアドレスの場合の処理
        Console.WriteLine("無効なメールアドレスです。");
    }
}
private bool IsValidEmail(string email)
{
    // 簡易的なメールアドレスの検証ロジック
    return email.Contains("@") && email.Contains(".");
}

このコードでは、ユーザーがTextBoxに入力するたびに、メールアドレスの形式を検証し、結果をコンソールに表示します。

入力内容に応じたUIの動的変更

TextChangedイベントを使用して、ユーザーの入力に応じてUIを動的に変更することも可能です。

例えば、特定のキーワードが入力された場合にボタンを有効化する例を示します。

private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string inputText = myTextBox.Text; // 現在のテキストを取得
    if (inputText.Equals("特定のキーワード"))
    {
        myButton.Enabled = true; // ボタンを有効化
    }
    else
    {
        myButton.Enabled = false; // ボタンを無効化
    }
}

このコードでは、TextBoxに特定のキーワードが入力された場合に、ボタンを有効化または無効化します。

これにより、ユーザーの入力に応じたインタラクティブなUIを実現できます。

入力履歴の記録

TextChangedイベントを利用して、ユーザーの入力履歴を記録することもできます。

以下の例では、入力されたテキストをリストに追加し、履歴を表示します。

private List<string> inputHistory = new List<string>(); // 入力履歴を格納するリスト
private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string inputText = myTextBox.Text; // 現在のテキストを取得
    if (!string.IsNullOrWhiteSpace(inputText))
    {
        inputHistory.Add(inputText); // 入力履歴に追加
        Console.WriteLine("入力履歴: " + string.Join(", ", inputHistory)); // 履歴を表示
    }
}

このコードでは、TextBoxに入力されたテキストが空でない場合に、履歴リストに追加し、現在の履歴をコンソールに表示します。

これにより、ユーザーが過去に入力した内容を追跡することができます。

TextChangedイベントの注意点

パフォーマンスへの影響

TextChangedイベントは、ユーザーがTextBoxに入力するたびに発生します。

そのため、入力が頻繁に行われる場合、イベントハンドラ内で重い処理を行うと、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。

例えば、データベースへのクエリや大規模な計算を行うと、ユーザーの入力が遅延することがあります。

これを避けるためには、以下のような対策が考えられます。

  • イベントハンドラ内での処理を軽量化する
  • 入力が完了した後に処理を行うために、タイマーを使用する
  • 一定の文字数以上の入力があった場合のみ処理を行う

不要なイベント発生の防止

TextChangedイベントは、TextBoxの内容が変更されるたびに発生しますが、プログラムからテキストを変更した場合にも発生します。

これにより、意図しない処理が実行されることがあります。

例えば、以下のようにプログラムでテキストを設定する場合、イベントが発生してしまいます。

myTextBox.Text = "新しいテキスト"; // これによりTextChangedイベントが発生

このような場合、イベントハンドラ内での処理を条件付きで実行することで、不要なイベント発生を防ぐことができます。

例えば、フラグを使用して、プログラムからの変更かユーザーの入力かを判別する方法があります。

他のイベントとの連携

TextChangedイベントは、他のイベントと連携して使用することができます。

例えば、TextBoxの内容が変更された際に、ボタンの有効/無効を切り替える場合、TextChangedイベントとLeaveイベントを組み合わせることが考えられます。

private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    myButton.Enabled = !string.IsNullOrWhiteSpace(myTextBox.Text); // テキストが空でない場合ボタンを有効化
}
private void MyTextBox_Leave(object sender, EventArgs e)
{
    // フォーカスが外れたときの処理
    Console.WriteLine("入力が完了しました。");
}

このように、TextChangedイベントを他のイベントと組み合わせることで、より複雑なユーザーインターフェースの動作を実現することができます。

イベントの連携を考慮することで、アプリケーションの使い勝手を向上させることが可能です。

応用例

複数TextBoxの同期

複数のTextBoxの内容を同期させることで、ユーザーが一方のTextBoxに入力した内容を他方にも反映させることができます。

以下の例では、2つのTextBoxの内容を常に一致させる方法を示します。

private void TextBox1_TextChanged(object sender, EventArgs e)
{
    // TextBox1の内容をTextBox2に反映
    textBox2.TextChanged -= TextBox2_TextChanged; // イベントを一時的に解除
    textBox2.Text = textBox1.Text; // 内容を同期
    textBox2.TextChanged += TextBox2_TextChanged; // イベントを再設定
}
private void TextBox2_TextChanged(object sender, EventArgs e)
{
    // TextBox2の内容をTextBox1に反映
    textBox1.TextChanged -= TextBox1_TextChanged; // イベントを一時的に解除
    textBox1.Text = textBox2.Text; // 内容を同期
    textBox1.TextChanged += TextBox1_TextChanged; // イベントを再設定
}

このコードでは、片方のTextBoxの内容が変更されると、もう片方のTextBoxにその内容を反映させています。

イベントを一時的に解除することで、無限ループを防いでいます。

入力内容に基づくデータベース検索

TextChangedイベントを利用して、ユーザーが入力した内容に基づいてデータベースを検索する機能を実装することも可能です。

以下の例では、TextBoxに入力された文字列を使って、データベースから関連するデータを取得する方法を示します。

private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string searchText = myTextBox.Text; // 現在のテキストを取得
    var results = SearchDatabase(searchText); // データベース検索
    // 検索結果を表示する処理
    DisplayResults(results);
}
private List<string> SearchDatabase(string query)
{
    // データベースからの検索ロジック(擬似コード)
    return new List<string> { "結果1", "結果2", "結果3" }; // 検索結果のリスト
}

このコードでは、TextBoxに入力された内容を使ってデータベースを検索し、結果を表示する処理を行っています。

ユーザーが入力するたびに検索が行われるため、リアルタイムでのフィードバックが得られます。

自動補完機能の実装

TextChangedイベントを活用して、自動補完機能を実装することもできます。

ユーザーがTextBoxに入力を始めると、過去の入力履歴や候補を表示することで、入力をサポートします。

以下の例では、簡単な自動補完機能を示します。

private List<string> suggestions = new List<string> { "Apple", "Banana", "Cherry", "Date", "Elderberry" }; // 候補リスト
private void MyTextBox_TextChanged(object sender, EventArgs e)
{
    string inputText = myTextBox.Text; // 現在のテキストを取得
    var filteredSuggestions = suggestions.Where(s => s.StartsWith(inputText, StringComparison.OrdinalIgnoreCase)).ToList(); // 入力に基づく候補をフィルタリング
    // 候補を表示する処理(擬似コード)
    ShowSuggestions(filteredSuggestions);
}
private void ShowSuggestions(List<string> suggestions)
{
    // 候補を表示するロジック(擬似コード)
    Console.WriteLine("候補: " + string.Join(", ", suggestions)); // コンソールに表示
}

このコードでは、ユーザーがTextBoxに入力するたびに、候補リストから一致する項目をフィルタリングし、表示する処理を行っています。

これにより、ユーザーは迅速に入力を行うことができ、利便性が向上します。

よくある質問

TextChangedイベントが発生しないのはなぜ?

TextChangedイベントが発生しない場合、以下のような原因が考えられます。

  • TextBoxが無効化されている: TextBoxが無効化(Enabled = false)されていると、ユーザーの入力が受け付けられず、イベントが発生しません。
  • イベントハンドラが設定されていない: TextChangedイベントに対するイベントハンドラが正しく設定されていない場合、イベントは発生しません。
  • TextBoxが表示されていない: フォーム上にTextBoxが表示されていない場合、ユーザーが入力できないため、イベントは発生しません。

TextChangedイベントでのパフォーマンスを改善するには?

TextChangedイベントでのパフォーマンスを改善するためには、以下の対策が有効です。

  • 処理を軽量化する: イベントハンドラ内で行う処理をできるだけ軽くし、重い処理は別スレッドで実行する。
  • タイマーを使用する: ユーザーが入力を終えた後に処理を行うために、タイマーを使用して一定時間待機してから処理を実行する。
  • 入力文字数に制限を設ける: 一定の文字数以上の入力があった場合のみ処理を行うことで、無駄な処理を減らす。

TextBoxのテキストをプログラムで変更した場合、TextChangedイベントは発生する?

はい、TextBoxのテキストをプログラムで変更した場合でも、TextChangedイベントは発生します。

例えば、以下のようにプログラムでテキストを設定すると、TextChangedイベントがトリガーされます。

myTextBox.Text = "新しいテキスト"; // これによりTextChangedイベントが発生

このため、プログラムからの変更とユーザーの入力を区別するためには、フラグを使用してイベントハンドラ内での処理を制御することが推奨されます。

まとめ

この記事では、C#のWindowsフォームにおけるTextBoxのTextChangedイベントの基本的な使い方から、実装方法、活用例、注意点まで幅広く解説しました。

特に、リアルタイムでの入力検証やUIの動的変更、自動補完機能の実装など、実際のアプリケーションで役立つ具体的な応用例を紹介しました。

これらの知識を活かして、よりインタラクティブで使いやすいアプリケーションを作成してみてください。

  • URLをコピーしました!
目次から探す