2016-07-11 1 views
0

SelectedIndexChangeを使用しないでコンボボックスが変更されているかどうかをVB.netアプリケーションが検出できるかどうかを確認します。SelectedIndexChangeを使用せずにコンボボックスがクリックされたかどうかを検出します。

私のアプリケーションには4つのコンボボックスがあり、このコンボボックスはユーザー設定から動的に作成されました。 (アプリケーション起動時にコンボボックスが自動作成されます)。その後、アプリケーションが起動されたら、それらのコンボボックスが変更されるたびにSUBを実行します。ひどく助けが必要でした。 TIA

+0

動的 'SelectedIndexChanged'の問題をいただきましたので、コントロールは、イベントに応答することができます作成​​しましたか? – Plutonix

+1

あなたは[間違った質問](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)を求めているかもしれません。 – sstan

+0

あなたはハンドラを追加してみませんか?これは、実行時にコントロールを作成しているので必要なものです。現在のコードを表示することなく、この種のことはあなたを助けてくれます。さらにお手伝いをさせていただいた内容で質問を更新してください。 – Codexer

答えて

0

コントロールを動的に作成する場合は、イベントハンドラも動的に追加する必要があります。 SelectedIndexChangedイベントの使用には何も問題ありません。

新しいプロジェクトを作成し、このコードをPublic Class Form1の中に貼り付けることでテストできます。

Private myComboBox1 As ComboBox 
Private myComboBox2 As ComboBox 

Private Shared selectedIndexChanged As EventHandler = 
    Sub(sender As Object, e As EventArgs) 
     Dim myComboBox = DirectCast(sender, ComboBox) 
     ' alert the user as to what was selected 
     MessageBox.Show(String.Format("{0} value: {1}, index: {2}", 
         myComboBox.Name, myComboBox.Text, myComboBox.SelectedIndex)) 
     ' you can do something different on each one by name in a case statement 
     Select Case myComboBox.Name 
      Case "myComboBox1" 
       ' do something for 1 
      Case "myComboBox2" 
       ' do something for 2 
     End Select 
    End Sub 

Private Sub addHandlers() 
    AddHandler myComboBox1.SelectedIndexChanged, selectedIndexChanged 
    AddHandler myComboBox2.SelectedIndexChanged, selectedIndexChanged 
End Sub 

Private Sub removeHandlers() 
    RemoveHandler myComboBox1.SelectedIndexChanged, selectedIndexChanged 
    RemoveHandler myComboBox2.SelectedIndexChanged, selectedIndexChanged 
End Sub 

フォームのEventHandler

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    ' dynamically generate combo boxes 
    myComboBox1 = New ComboBox() With {.Name = "myComboBox1", 
             .Left = 30, 
             .Top = 30} 
    myComboBox2 = New ComboBox() With {.Name = "myComboBox2", 
             .Left = 30, 
             .Top = 60} 
    ' add some items 
    myComboBox1.Items.AddRange({1, 2, 3}) 
    myComboBox2.Items.AddRange({"four", "five", "six"}) 
    ' add the combo boxes to the form 
    Me.Controls.Add(myComboBox1) 
    Me.Controls.Add(myComboBox2) 
    ' add event handlers 
    addHandlers() 
End Sub 

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed 
    removeHandlers() 
End Sub 
+0

OPが試みたり試したことのない回答を投稿しただけでなく、ハンドラも削除することが重要です。ハンドラーが***削除されていないときに悪いことが起こります。 OPに試行がない場合は、回答を投稿しないようにしてください。このようなことが明らかな場合、人々はアイデアを得るかもしれません***ここではそうではありません***。したがって私は答えを投稿しなかった理由ではなく、コメントです。 – Codexer

+0

**これをテストするには、新しいプロジェクトを作成してこのコードを貼り付けます。**はデモであり、OPの完全な解決策ではありません。 OPは彼がそれから望むものを取ることができ、彼はそれを無視する。あなたは彼を助けるのが難しいと言った。あなたのために、多分?私はそれを書いて楽しんでいました。このデモでコードの作業に必要な要素が十分にあることを願っています。ちなみに、SOは、初心者が正しい質問をする方法を正確に知らないときに援助を得ないことによって拒否されたときに苦しんでいます。私は3つのエリート主義的なコメントを見て、あまり助けにはならなかった。 – djv

+0

イベントハンドラを変数に格納する答えを更新したので、後で削除することができます。これは、コントロールがフォームから削除されたときに実行する必要があります。フォームが配置されたときにも実行できます。http://stackoverflow.com/questions/17399991/should-i-always-disconnect-event-handlers-in-the-dispose-method非常に良い例です。 – djv

関連する問題