2009-07-25 7 views
1

インデックスが変更されたComboBoxが14個ある場合に処理するサブアイテムがあります。私はイベントの送信者を投げてそこからプロパティを得ることができます。しかし、その後、キャストよりも実際の送信者のプロパティを変更できるようにしたいと考えています。どうすればいい?VB.NETで不明なオブジェクトのプロパティを変更します。

現在のコード:

Private Sub ComboBoxIndexChange(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, ComboBox2.SelectedIndexChanged [etc] 
     Dim myComboBox As ComboBox = sender 

     Select Case myComboBox.Text 
      Case "Will" 
       Me.Controls(myComboBox.Name).Text = "555-555-555" 
      Case "Bob" 
       Me.Controls(myComboBox.Name).Text = "555-124-1234" 
      [etc] 
     End Select 
    End Sub 
End Class 

あなたが見ることができるように、私は現在

Me.Controls(myComboBox.Name).Text 

を使用しようとしています。しかし、私はエラーを取得する:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

どうすればよいですか?

+0

を、あなたは、「実際の送信者」とは何を意味するのですか? –

+0

最初にイベントをトリガーしたオブジェクト。 – tom

+3

これはコンボボックスです。既にオブジェクトがあります: 'myComboBox'。 –

答えて

2

イベントハンドラのパラメータsenderには、(通常)イベントを発生させたオブジェクトへの参照が含まれます。 ComboBoxコントロールのSelectedIndexChangedイベントの場合は、SelectedIndexプロパティが変更されたComboBoxになります。したがって、上記のコードサンプルでは、​​myComboBoxはイベントを発生させたComboBoxを参照しています。

を明確にする:あなたはComboBoxコントロールのドロップダウンリストの項目を選択した場合、それはSelectedIndexChangedイベントを発生させるように、イベントハンドラのSenderパラメータはのそのComboBox同じではなく、コピーとなりますそれ。これはすべての参照タイプに当てはまります。

イベントを呼び起こす価値のタイプであれば、それはまったく別の話だったでしょうが、それは非常にまれなケースです(フォーム上のコントロールには当てはまりません)。

1

ComboBoxは参照型であるため、myComboBox変数のTextプロパティに直接割り当てると、コントロールが更新されます。

+0

ありがとう、私はそれが参考であったことを知らなかった。私はちょうどいくつかのデバッグを行って、実際にComboBoxのテキストプロパティを変更しますが、その直後に元の値(この場合は「Will」)に戻っています。どのようなアイデアが起こっている? – tom

+0

@blake: 'SelectedIndexChanged'イベントのコンボボックスに' Text'プロパティを設定するのは良い考えではありません。ユーザがリスト内の項目を選択すると、コントロールは自動的に「テキスト」を選択された項目のテキストに設定する。 –

+0

私はそれをどのような場合に変更できますか?私が望むのは、ユーザーがコンボボックス内の人物の名前を選択することだけです。コンボボックスは電話番号として表示されます。 – tom

0

これは動作するはずです:

Dim ctl As Control 
Dim cmb As ComboBox 

For Each ctl In Me.Controls 
    If sender Is ctl Then 
    cmb = ctl 
    cmb.Text = "string" 
    End If 
    Next ctl 

あなたはcmd.Text =「文字列」の代わりに特定の文字列の割り当てコードを追加することができます。 cmbを割り当てると、ジェネリックコントロールプロパティではなく、特定のコンボボックスプロパティを使用できます。

0

nullオブジェクト参照例外を取得した理由についての元の質問に答えるには、フォームの直接の子を検索するコントロールはありますか?フォーム上のパネルや他のコンテナに座っていますか?もしそうなら、私はFormのControlsコレクションでそのコントロールを見つけることはできないと思います。したがって、この行:

Me.Controls(myComboBox.Name).Text 

これらのコントロールの子を再帰的に使用するのではなく、直接的な子フォームから検索します。

0

次のコードを使用すると、同じエラーが発生します。オブジェクト参照がオブジェクトのインスタンスに設定されていません。

Me.Controls(TBName).DataBindings.Add("Text", dt, dt.Columns(colindex).ColumnName) 

クリスチャン・ペーニャからの暗示が私の場合にフィットするので、右のコードは次のようになります。

Me.TCAll.TabPages(0).Controls(TBName).DataBindings.Add("Text", dt, dt.Columns(colindex).ColumnName) 
関連する問題