2009-07-25 15 views
1

Ich habe ein Sub, das behandelt, wenn 14 ComboBoxes ihren Index geändert haben. Ich bin in der Lage, den Absender des Ereignisses zu casten und Eigenschaften von dort zu erhalten. Danach möchte ich jedoch in der Lage sein, die Eigenschaften des eigentlichen Senders anstelle des Besetzten zu ändern. Wie würde ich das tun?Ändern Sie die Eigenschaften eines unbekannten Objekts in VB.NET

Aktueller Code:

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 

Wie Sie sehen können, ich versuche zur Zeit

Me.Controls(myComboBox.Name).Text 

zu verwenden, aber ich habe den Fehler: Der Objektverweis auf eine Instanz eines Objekts eingestellt.

Was kann ich tun?

+0

Was meinen Sie mit "dem tatsächlichen Absender"? –

+0

Das Objekt, das das Ereignis an erster Stelle ausgelöst hat. – tom

+3

Aber das ist die Combobox ... Sie haben bereits das Objekt: 'myComboBox'. –

Antwort

2

Der sender Parameter in einem Event-Handler wird (typischerweise) enthält eine Referenz auf das Objekt, das das Ereignis ausgelöst hat. Im Falle des SelectedIndexChanged Falle einer ComboBox Kontrolle, wird es das ComboBox sein, der seine SelectedIndex Eigenschaft geändert hatte. Also in Ihrem Codebeispiel über myComboBox bezieht sich die ComboBox, die das Ereignis ausgelöst.

Um zu klären: Wenn Sie ein Element in der Dropdown-Liste eines ComboBox Steuerelement auswählen, so dass es das SelectedIndexChanged Ereignis auslöst, werden die Sender-Parameter des Event-Handler selber ComboBox sein, keine Kopie es. Dies gilt für alle Referenztypen.

Wäre es ein Wertetyp gewesen, der das Ereignis ausgelöst hätte, wäre das eine ganz andere Geschichte gewesen, aber das ist ein sehr seltener Fall (es ist nie der Fall, wenn es um Steuerelemente in einem Formular geht).

1

ComboBox ist ein Referenztyp, so dass, wenn Sie direkt auf die Eigenschaft Text des MeineComboBox Variablen zuweisen, wird die Steuerung zu aktualisieren.

+0

Danke, ich hatte keine Ahnung, dass es eine Referenz war. Ich habe gerade etwas debuggen gemacht und es ändert tatsächlich die Texteigenschaft der ComboBox, aber sofort danach änderte es zurück zu seinem ursprünglichen Wert (in diesem Fall "Willen"). Irgendeine Idee was passiert? – tom

+0

@blake: Es ist keine gute Idee, die 'Text' -Eigenschaft in einem Kombinationsfeld im' SelectedIndexChanged' -Ereignis zu setzen; Wenn der Benutzer ein Element in der Liste auswählt, setzt das Steuerelement den Text automatisch auf den Text des ausgewählten Elements. –

+0

In welchem ​​Fall könnte ich es dann ändern? Ich möchte nur, dass der Benutzer den Namen der Person in der Kombinationsbox auswählt, die dann als ihre Telefonnummer angezeigt wird. – tom

0

sollte diese Arbeit:

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 

Sie den Zuordnungscode anstelle bestimmten Zeichenfolge hinzufügen können von cmd.Text = "string". Wenn Sie cmb zuweisen, können Sie die spezifischen Combobox-Eigenschaften anstelle der allgemeinen Steuerelementeigenschaften verwenden.

0

Um die ursprüngliche Frage zu beantworten, warum Sie wurden ein Null-Objekt Referenz-Exception bekommen, wird die Kontrolle Sie für ein direktes Kind des Formulars suchen? Sitzt es in einem Panel oder einem anderen Container auf dem Formular? Wenn das der Fall ist, dann glaube ich nicht, dass Sie dieses Steuerelement in der Controls-Sammlung des Formulars finden werden. Also diese Zeile:

Nur Durchsuchungen durch die Formulare direkte Kinder und nicht rekursiv durch die Kinder dieser Steuerelemente.

0

Wenn ich den folgenden Code verwenden, werde ich die gleiche err erhalten: Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

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

Sugestion von Christian Pena passen meinem Fall, so der richtige Code sein sollte:

Me.TCAll.TabPages(0).Controls(TBName).DataBindings.Add("Text", dt, dt.Columns(colindex).ColumnName) 
Verwandte Themen