はじめに
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ステップで行ってくれるプロパティです。
「選択範囲を削除して新しい文字を挿入する」という操作を、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+SelectionLengthがText.Lengthを超えないようにする必要があります。 - IMEとのからみ
日本語入力(IME)変換中は、変換中テキストの扱いが特殊になることがあります。
厳密な制御が必要な場合は、IMEの状態も考慮した設計が必要です。 - Text変更後は位置が変わる
Textを書き換えたあとは、SelectionStart/SelectionLengthの値が無効になることがあります。
テキスト更新後に再設定しましょう。
まとめ
SelectedText… 現在の選択文字列。代入すれば選択範囲を置換できる。SelectionStart… 選択開始位置(カーソル位置)。文字列の先頭は 0。SelectionLength… 選択文字数。0 なら選択なし。- 3つを組み合わせることで、部分編集・置換・カーソル移動を柔軟に制御できる。
- テキスト編集可能なのは
DropDown/Simple。DropDownListでは実質使えない。
「コンボボックスに入力されたテキストを、ちょっとだけ加工したい」「この部分だけ書き換えたい」
というときに、この3つのプロパティはとても頼りになります。
まずは SelectionStart と SelectionLength で選択範囲を作り、SelectedText で中身を入れ替える、
というパターンから試してみてください。
Please follow and like us:

コメント