[C#][Windows Formsアプリ][ComboBox] SelectedText・SelectionStart・SelectionLengthプロパティでテキスト選択を使いこなす

スポンサーリンク

はじめに

ComboBoxを「入力欄」として使う場合、テキストの選択状態カーソル位置を細かく制御したくなることがあります。
そのときに使うのが、SelectedText / SelectionStart / SelectionLength の3つのプロパティです。

前提:
この記事は DropDownStyle = DropDown または DropDownStyle = Simple のときに有効な内容です。
DropDownList の場合はテキスト編集ができないため、これらのプロパティは実質使えません。

 

3つのプロパティの役割

プロパティ 役割
SelectedText string 現在選択されているテキスト。設定すると「選択範囲を置き換える」。
SelectionStart int 選択開始位置(0から数えた文字インデックス)。カーソル位置でもある。
SelectionLength int 選択されている文字数。0なら選択なし(カーソルのみ)。

この3つを組み合わせることで、「どこから」「何文字分」を選択しているかを取得・設定できます。

 

SelectedTextプロパティ

選択されている文字列の取得

string selected = comboBox1.SelectedText;
MessageBox.Show($"選択中の文字: [{selected}]");

マウスドラッグやキーボード操作で選択された範囲の文字列を、そのまま取得できます。

選択範囲の文字を置き換える

// 選択されている文字列を「XXX」に置き換える
comboBox1.SelectedText = "XXX";

SelectedText に文字列を代入すると、現在の選択範囲がその文字列で置換されます。
選択されている部分がない場合は、カーソル位置に文字列が挿入されます。

💡 イメージ:
「選択範囲を削除して新しい文字を挿入する」という操作を、1ステップで行ってくれるプロパティです。

 

SelectionStartプロパティ

SelectionStart は「選択開始位置」、つまりカーソルの位置を示します。
文字列の先頭は 0、2文字目は 1…というように、0ベースのインデックスで扱います。

現在のカーソル位置を取得する

int caretPos = comboBox1.SelectionStart;
MessageBox.Show($"カーソル位置: {caretPos}");

カーソル位置を移動する

// 文字列の末尾にカーソルを移動
comboBox1.SelectionStart  = comboBox1.Text.Length;
comboBox1.SelectionLength = 0;  // 選択解除

「末尾へカーソル移動」「先頭へ移動」など、ユーザーが入力しやすい位置にカーソルを誘導するときに便利です。

 

SelectionLengthプロパティ

SelectionLength は、「選択されている文字数」を表します。
0 の場合は選択がなく、単にカーソルがあるだけの状態です。

選択文字数を確認する

int len = comboBox1.SelectionLength;
MessageBox.Show($"選択文字数: {len}");

指定した範囲を選択する

SelectionStart と組み合わせて使用します。

// 先頭から3文字を選択
comboBox1.SelectionStart  = 0;
comboBox1.SelectionLength = 3;

 

3つを組み合わせた実用例

例1:先頭の3文字を大文字に変換

private void buttonUpperFirst3_Click(object sender, EventArgs e)
{
    if (comboBox1.Text.Length < 3) return;

    // 先頭3文字を選択
    comboBox1.SelectionStart  = 0;
    comboBox1.SelectionLength = 3;

    // 選択範囲を大文字に置き換え
    string upper = comboBox1.SelectedText.ToUpper();
    comboBox1.SelectedText = upper;

    // 選択を解除して末尾にカーソルを移動
    comboBox1.SelectionStart  = comboBox1.Text.Length;
    comboBox1.SelectionLength = 0;
}

例2:カーソル位置の単語を取得する(簡易版)

private string GetWordAtCaret(ComboBox combo)
{
    string text = combo.Text;
    int pos = combo.SelectionStart;

    if (string.IsNullOrEmpty(text) || pos < 0 || pos > text.Length)
        return string.Empty;

    // 左方向へ空白まで戻る
    int start = pos;
    while (start > 0 && !char.IsWhiteSpace(text[start - 1]))
    {
        start--;
    }

    // 右方向へ空白まで進む
    int end = pos;
    while (end < text.Length && !char.IsWhiteSpace(text[end]))
    {
        end++;
    }

    combo.SelectionStart  = start;
    combo.SelectionLength = end - start;
    return combo.SelectedText;
}

このように、選択範囲を動かしながら「単語」「部分文字列」を取得することもできます。

 

注意点

  • DropDownList では使用できない
    DropDownStyle = ComboBoxStyle.DropDownList の場合、ユーザーがテキストを編集しない前提のため、
    これらのプロパティを使っても意味がありません。
  • インデックスの範囲に注意
    SelectionStart + SelectionLengthText.Length を超えないようにする必要があります。
  • IMEとのからみ
    日本語入力(IME)変換中は、変換中テキストの扱いが特殊になることがあります。
    厳密な制御が必要な場合は、IMEの状態も考慮した設計が必要です。
  • Text変更後は位置が変わる
    Text を書き換えたあとは、SelectionStart / SelectionLength の値が無効になることがあります。
    テキスト更新後に再設定しましょう。

 

まとめ

  • SelectedText … 現在の選択文字列。代入すれば選択範囲を置換できる。
  • SelectionStart … 選択開始位置(カーソル位置)。文字列の先頭は 0。
  • SelectionLength … 選択文字数。0 なら選択なし。
  • 3つを組み合わせることで、部分編集・置換・カーソル移動を柔軟に制御できる。
  • テキスト編集可能なのは DropDown / SimpleDropDownList では実質使えない。

「コンボボックスに入力されたテキストを、ちょっとだけ加工したい」「この部分だけ書き換えたい」
というときに、この3つのプロパティはとても頼りになります。
まずは SelectionStartSelectionLength で選択範囲を作り、SelectedText で中身を入れ替える、
というパターンから試してみてください。

Please follow and like us:

コメント

タイトルとURLをコピーしました