プロが教える店舗&オフィスのセキュリティ対策術

C#でツールを作っています。

テキストボックス内に書かれている文字列中にカーソルを置いて
そのカーソル部分に任意の文字を挿入する処理に、TextBox.SelectionStart を使っています。

text_box.Text = text_box.Text.Insert(text_box.SelectionStart, string_word);

text_box …テキストボックス名
string_word …挿入する文字

これを同じようにコンボボックスの中でもやりたいのですが
ビルドエラーにはならないものの、上手く動作しません。
デバッグで見てみると、SelectionStart=0 となっており、
常にコンボボックス内の先頭に挿入されてしまいます。

コンボボックスでは無理なのでしょうか?
MSDNライブラリでは、テキストボックスと変わらない説明がされているのですが…
http://msdn2.microsoft.com/ja-jp/library/system. …

A 回答 (3件)

以下のような代替方法があります。


コンボボックスの裏でStringBuilderをつかいます。
(ただし十字キーでSelectionStartを移動した場合には対応できていません。)
コンボボックス:comboBox1
コマンドボタン:button2
----------------------------------------------------------
StringBuilder sb = new StringBuilder();
int start=0;

private void comboBox1_MouseDown(object sender, MouseEventArgs e)
{
sb.Remove(0, sb.Length);
sb.Append(comboBox1.Text);
start = comboBox1.SelectionStart;
}

private void button2_Click(object sender, EventArgs e)
{
string ins_word = "あいう";
sb.Insert(start, ins_word);
comboBox1.Text = sb.ToString();

}

private void comboBox1_TextChanged(object sender, EventArgs e)
{
sb.Remove(0, sb.Length);
sb.Append(comboBox1.Text);
start = comboBox1.SelectionStart;

}
----------------------------------------------------------
    • good
    • 1

SelectionStartプロパティは、そのコントロールが非アクティブになったり、Textプロパティが変更された場合、0になります。

ですので、例えば別のButtonのClickイベントハンドラ内で参照しようとしても、既にComboBoxのフォーカスが失われた後なので上手くいきません。

まずはそこを確認してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やろうとしていたのは、ボックス内のどこかにカーソルを置いた状態で
別フォームをオープン→そのフォーム内から挿入文字を選択→コンボボックスに反映
という動きでしたので、上手くいかないわけですね。

う~ん、代替案はないものでしょうか…?

お礼日時:2007/05/26 13:17

C#ではないですがVB.NET Express Editionユーザです。


で検証してみました。

[検証方法]

New Project > Windows Form Application > OK
[デザイン]タブ上のForm1に
ツールボックスから
テキストボックス(TextBox1)、コンボボックス(ComboBox1)をそれぞれ貼り付け、さらにコマンドボタン(CommandButton1)を貼り付けます。

この時、ComboBox1のDropDownStyleはDropDownです

Form1.vbに以下のコードを打ち込みます

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(TextBox1.SelectionStart.ToString)
MessageBox.Show(ComboBox1.SelectionStart.ToString)


End Sub
End Class

TextBox1に「あいうえ」と打ち込み、
「い」の後にカーソルを持って行きます

CommandButton1をクリックし、

2
0

がそれぞれ表示することを確認します。

そしてそのまま

ComboBox1に「あいうえ」と打ち込み、
「い」の後にカーソルを持って行きます。

CommandButton1をクリックすると・・・・★
やはり

2
0

と表示されることが確認できます。

そこでコードを以下のように変更し

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(TextBox1.SelectionStart.ToString)
MessageBox.Show(ComboBox1.SelectionStart.ToString)


End Sub

Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged

MessageBox.Show(ComboBox1.SelectionStart.ToString)


End Sub
End Class

ComboBox1にテキストを打ち込んでいきます

「あ」「い」「う」と選択状態を外しながら一文字ずつ打ち込みそれぞれEnterを押し
それぞれのタイミングで
1
2
3
と表示されます(つまりきちんと変化はしているが、テキストボックスと異なり★印で選択状態が解除されてしまっている)

ここで全てのテキストを消し
「あいう」と一気に打ち込んでみたら
何故か「いうあ」という順番でテキストボックスに入力されるようで

2
1
1

と表示されました。
    • good
    • 0
この回答へのお礼

細かい検証、大変ありがとうございます!

なるほど、ANo.2でも書かれている通り、
フォーカスが外れてしまうとダメなのですね。。。

お礼日時:2007/05/26 13:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!