• 締切済み

【C#】コンボボックスにおけるSelectionStart

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.windows.forms.combobox.selectionstart(VS.80).aspx

みんなの回答

  • ape5
  • ベストアンサー率57% (85/148)
回答No.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; } ----------------------------------------------------------

  • thyristor
  • ベストアンサー率76% (13/17)
回答No.2

SelectionStartプロパティは、そのコントロールが非アクティブになったり、Textプロパティが変更された場合、0になります。ですので、例えば別のButtonのClickイベントハンドラ内で参照しようとしても、既にComboBoxのフォーカスが失われた後なので上手くいきません。 まずはそこを確認してみてください。

TON-KATSU
質問者

お礼

回答ありがとうございます。 やろうとしていたのは、ボックス内のどこかにカーソルを置いた状態で 別フォームをオープン→そのフォーム内から挿入文字を選択→コンボボックスに反映 という動きでしたので、上手くいかないわけですね。 う~ん、代替案はないものでしょうか…?

回答No.1

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 と表示されました。

TON-KATSU
質問者

お礼

細かい検証、大変ありがとうございます! なるほど、ANo.2でも書かれている通り、 フォーカスが外れてしまうとダメなのですね。。。

関連するQ&A

  • テキストボックスの表示について

    visual basic2010を使用しています。 コンボボックスAの選択が1~4だった時、コンボボックスB、C、Dの選択された結果を、ボタンクリックを経てテキストボックスに表示させるにはどうすればいいでしょうか? If ComboBox1.Text = "1" Then TextBox1.Text = (ComboBox2.Text) TextBox1.Text = (ComboBox3.Text) TextBox1.Text = (ComboBox4.Text) ElseIf ComboBox1.Text = "2" Then TextBox2.Text = (ComboBox2.Text) TextBox2.Text = (ComboBox3.Text) TextBox2.Text = (ComboBox4.Text) ElseIf ComboBox1.Text = "3" Then TextBox3.Text = (ComboBox2.Text) TextBox3.Text = (ComboBox3.Text) TextBox3.Text = (ComboBox4.Text) Else TextBox4.Text = (ComboBox2.Text) TextBox4.Text = (ComboBox3.Text) TextBox4.Text = (ComboBox4.Text) End If 実行した結果、ComboBox4のみの結果がテキストボックスに表示されてしまいました。 '変数を使った場合 If ComboBox2.Text = "1" Then Dim st As String st = (ComboBox3.Text),(ComboBox4.Text),(ComboBox5.Text) textbox1.Text = st ElseIf ~~~~~~~~~~^ こちらは「ステートメントの終わりを指定してください」と出て動作しませんでした。 以上、宜しくお願い致します。

  • コンボボックスからテキストボックスへのデータ反映

    コンボボックスにてデータ(文字列+数字)を選択して、同フォーム内にある テキストボックスへ数字だけを表示させるにはどのようにコードを入力すれば良いでしょうか? VS2010を利用しています。 コンボボックスには、●●会社 00000000000 ▲▲会社 1111111111 といったように登録されております。 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged TextBox1.Text = ComboBox1.Text End Sub 上記のコードですと、文字列+数字がテキストボックスへ反映されてしまいます。 お忙しい中お手数をお掛けしますが、ご教授下さい。

  • コンボボックスのイベントについて

    OS  :WindowsXP Pro SP1 開発環境:VisualStudio .NET 2003 開発言語:C# 開発形態:Windowsアプリケーション いつもこの場にお世話になっております。 今回もよろしくお願い致します。 現在、Windowsアプリケーションを作成しており、フォームにはコンボボックスとテキストが貼り付けてあります。コンボボックスは配列になっています。 using System.Windows.Forms; public class Form1 : System.Windows.Forms.Form { 省略   private ComboBox[] cmbArray = new ComboBox[3]; } private void Form_Load(object sender, System.EventArgs e) // フォームロード {   cmbArray[0] = comboBox1;   cmbArray[1] = comboBox2;   cmbArray[2] = comboBox3; } // イベントハンドラの登録 for( int i=0 ; i<3 ; i++) {   cmbArray[i].Validated += new System.EventHandler(ComboBoxClick); } private void ComboBoxClick(object sender, System.EventArgs e) {   MessageBox.Show(((ComboBox)sender).Text); } プログラムは上記のようになっています。 ここで質問なのですが、コンボボックス内のアイテムが変更されたらすぐに発生するイベントは何なのでしょうか?ここではClickイベントを使用していますが、コンボボックス内のアイテムを変更し、そのコンボボックスからカーソルが別のコントロールに移動して初めて発生します。 いろいろとイベントを試したのですが、どれもカーソルが移動する際に発生しているようなのです。 コンボボックス内のアイテムが変更されたらすぐに発生するイベントはあるのでしょうか?どなたかご存知の方がおりましたら、どうかご教授願います。

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • コンボボックスを読み取り専用にするには

    VB2005です。 コンボボックスを読み取り専用にしたいのですが、 TextBoxにはReadOnly=Trueにすれば読み取り専用になりますが ComboBoxを読み取り専用にしたい場合は、どうしたらよいのでしょうか?

  • コンボボックスの変更に応じてテキストボックスの有効を切り替える(ExcelVBA2007)

    お世話になります。 Excel VBA 2007で質問です。 今、  Label1 ComboBox1 TextBox1  Label2 ComboBox2 TextBox2 ・・・  Label100 ComboBox100 TextBox100 のようなフォームがあるとします。 ComboBox1~100は「Any」「is」「is not」のいずれかの値が取れ、初期値はAnyとします。 TextBox の Enabled プロパティの初期値は False とします。 やりたいことは、 ComboBox が「Any」でない場合(is または is not のいずれかの場合)にのみその右隣の TextBox の Enabled プロパティを True にしたいのです。 いま、ComboBox30 を Any から is に切り替えたとします。 すると、TextBox30.Enabled を False から True にしたいのです。 ここで、ComboBox30 を is から is not に切り替えたとします。 TextBox30.Enabled は True のままです。 ここで、ComboBox30 を is not から Any に切り替えたとします。 すると、TextBox30.Enabled を True から False にしたいのです。 ComboBox のイベントハンドラで Sub ComboBox30_Change ()  If ComboBox30.Value = "Any" Then   TextBox30.Enabled = "False"  Else   TextBox30.Enabled = "True"  End If End Sub のように書けばいいことは分かっているのですが、その場合は数字だけ変えたイベントハンドラを100個書かなければなりません。 このイベントハンドラを1個にすることはできるでしょうか。 (コンボボックス100個のうちどれかが変更されたら、変更されたコンボボックスの番号を知りながら呼び出されるハンドラ) 次善の策として、 Sub ComboBox30_Change ()  userSubroutine End Sub のように書くこともできるかと思いますが、この場合、どのコンボボックスが変更されたか(どのイベントハンドラが起動されたか)を知って、userSubroutine に渡さなければなりません。 よろしくお願いします!

  • コンボボックスの初期表示について

    コンボボックスの初期表示についてですが、 試験できる環境がないため、以下の認識で正しいか教えてください。 コンボボックス1行目を表示 ComboBox1.SelectedIndex = 0 コンボボックス2行目を表示 ComboBox1.SelectedIndex = 1 空白を表示 ComboBox1.SelectedIndex = null or "" 文字を表示 ComboBox1.SelectedIndex = "表示"

  • ウェブサイトのコンボボックスのアイテムを取得したいVB.NET

    ブラウザに表示されているコンボボックスのアイテムの文字列を取得したいです。 出来ればそのコンボボックスに登録されているものを 全部取得したいのですが、1つだけでも構いません。 a = AxWebBrowser1.Document.forms(0).Elements("ComboBox1").text 上記のような方法で取得しようとしているのですが、 .text の場合はHTMLSelectElementClassのメンバではないというエラーが出てしまいます。 Valueですと選択しているインデックス番号が取得できるのですが、 そうではなくて実際に表示される文字列を取得したいです。 あとこれを取得することが出来た場合、 For Nextで0~10などで AxWebBrowser1.Document.forms(0).Elements("ComboBox1").Value = i で選択を変更しては、取得するということを繰り返して 登録されているアイテム全てを取得しようと思っているのですが、 一度に全部取得する方法がありましたら教えて頂きたいです。 よろしくお願いいたします。

  • エクセル VBA コンボボックスの計算

    UserForm1上に コンボボックスには数字がリストされます! ComboBox1、ComboBox2、ComboBox3 3つ作成して 例えば ComboBox1=1 ComboBox2=0 ComboBox3=5 と表示された時 CommandButton1をクリックしたら UserForm2の TextBox1に”6”と足し算 された数字を表示したいのですが 普通のセルなら 出来るのですが・・ ComboBoxでするなら どのような記述に なるのでしょうか? すいません、教えて下さい!

  • VBAのコンボボックスのカラムについて

    以下のようにしてコンボボックスのカラムにも文字列が入るようにしております。 With ComboBox1 .AddItem "hogehoge" ComboBox1.List(0, 1) = "aiueo" End With これによってコンボボックスをクリックして出てくるリストにはhogehogeとaiueoの両方が 出てきますが、これを選択するとhogehogeだけがコンボボックスに残され、 (0,1)にあった文字列は消えてしまいます。 リストから選択した後もコンボボックス内にカラムの文字を残すにはどのようにすればよろしいでしょうか?(できれば区切りありで) よろしくお願いします。

専門家に質問してみよう