none
[VB 2005] ComboBox auf TabControl gibt Text nicht her RRS feed

  • Frage

  • Hallo,

    ich würde gern den in einer ComboBox angezeigten Text in eine Variable schreiben. Ich mache das wie folgt:

    Dim Drucktext As String
    Drucktext = Me.cboKampfrichtertyp.Text

    Wenn ich mir nun den Inhalt der Variable Drucktext anzeigen lasse (in meinem Fall wird er ausgedruckt), so steht dort "System.Data.DataRowView" anstelle dem in der ComboBox angezeigten Text.

    Die ComboBox befindet sich auf einer aktuell nicht anzeigten Registerkarte eines TabControls. Nachdem ich die Registerkarte mir hab anzeigen lassen, beinhaltet auch der Drucktext den Text der ComboBox. Dieses Verhalten zeigt sich nur bei der ComboBox, nicht bei TextBox. Was vergesse ich hier?

    Ich wäre dankbar, wenn mir hier jemand weiterhelfen kann - ich seh den Wald vor lauter Bäumen grad nicht mehr.

    Danke und Gruß,
    Torsten

    Dienstag, 12. Oktober 2010 18:17

Antworten

  • Hallo Torsten,

    Wenn ich mir nun den Inhalt der Variable Drucktext anzeigen lasse (in meinem Fall wird er ausgedruckt), so steht dort "System.Data.DataRowView" anstelle dem in der ComboBox angezeigten Text.

    Die ComboBox befindet sich auf einer aktuell nicht anzeigten Registerkarte eines TabControls. Nachdem ich die Registerkarte mir hab anzeigen lassen, beinhaltet auch der Drucktext den Text der ComboBox. Dieses Verhalten zeigt sich nur bei der ComboBox, nicht bei TextBox. Was vergesse ich hier?

    Ich nehme an, dass Du die ComboBox über die DataSource Eigenschaft an eine DataTable gebunden hast. Hier wäre entscheidend, wann die Zuweisung des DisplayMember der ComboBox erfolgt. Ich kann das von Dir geschilderte Verhalten reproduzieren, wenn ich zuerst DataSource zuweise und danach den DisplayMember festlege.

     ComboBox1.DataSource = source
     ComboBox1.DisplayMember = "Value"
    

    Mache ich es umgekehrt, kann ich zu jeder Zeit den angezeigten Text auslesen, egal ob das Register angezeigt habe oder nicht.

     ComboBox1.DisplayMember = "Value"
     ComboBox1.DataSource = source
    

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Dienstag, 12. Oktober 2010 20:00
    Moderator

Alle Antworten

  • Hallo Torsten,

    Wenn ich mir nun den Inhalt der Variable Drucktext anzeigen lasse (in meinem Fall wird er ausgedruckt), so steht dort "System.Data.DataRowView" anstelle dem in der ComboBox angezeigten Text.

    Die ComboBox befindet sich auf einer aktuell nicht anzeigten Registerkarte eines TabControls. Nachdem ich die Registerkarte mir hab anzeigen lassen, beinhaltet auch der Drucktext den Text der ComboBox. Dieses Verhalten zeigt sich nur bei der ComboBox, nicht bei TextBox. Was vergesse ich hier?

    Ich nehme an, dass Du die ComboBox über die DataSource Eigenschaft an eine DataTable gebunden hast. Hier wäre entscheidend, wann die Zuweisung des DisplayMember der ComboBox erfolgt. Ich kann das von Dir geschilderte Verhalten reproduzieren, wenn ich zuerst DataSource zuweise und danach den DisplayMember festlege.

     ComboBox1.DataSource = source
     ComboBox1.DisplayMember = "Value"
    

    Mache ich es umgekehrt, kann ich zu jeder Zeit den angezeigten Text auslesen, egal ob das Register angezeigt habe oder nicht.

     ComboBox1.DisplayMember = "Value"
     ComboBox1.DataSource = source
    

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Dienstag, 12. Oktober 2010 20:00
    Moderator
  • Hallo Torsten,

    ich würde gern den in einer ComboBox angezeigten Text in eine
    Variable schreiben. Ich mache das wie folgt:

    Dim Drucktext As String
    Drucktext = Me.cboKampfrichtertyp.Text

    Wenn ich mir nun den Inhalt der Variable Drucktext anzeigen lasse
    (in meinem Fall wird er ausgedruckt), so steht dort
    "System.Data.DataRowView" anstelle dem in der ComboBox
    angezeigten Text.

    Du hast Deiner ComboBox offenbar eine DataTable oder DataView
    als DataSouce zugewiesen:

        ComboBox1.DataSource = DeineDataTable

    oder

        Dim DV as DataView = DeineDataTable.DefaultView
        ComboBox1.DataSource = DV

    Die ComboBox liefert somit den in der DataView akt.
    ausgewählen Datensatz (DataRowView). Diese DataRowView
    dürfte vermutlich mehrere Felder (Spalten) haben und deshalb
    musst Du der ComboBox via ComboBox.DisplayMember
    sagen, welches Feld die ComboBox im Textteil anzeigen soll.

    Die ComboBox befindet sich auf einer aktuell nicht anzeigten
    Registerkarte eines TabControls. Nachdem ich die Registerkarte
    mir hab anzeigen lassen, beinhaltet auch der Drucktext den Text
    der ComboBox. Dieses Verhalten zeigt sich nur bei der
    ComboBox, nicht bei TextBox. Was vergesse ich hier?

    Du hast vergessen ComboBox.DisplayMember und evtl. auch
    ComboBox.ValueMember anzugeben:

        ComboBox.DisplayMember = "FeldNameX"
        ComboBox.ValueMember = "FeldNameY"

    Ich wäre dankbar, wenn mir hier jemand weiterhelfen kann - ich
    seh den Wald vor lauter Bäumen grad nicht mehr.

    Im nachfolgenden Beispiel siehst Du die verschiedenen
    Möglichkeiten auf den akt. in der ComboBox ausgewählten
    Eintrag zuzugreifen.

    Kopiere den Code einfach in ein leeres Formmodul (Form1.vb)

    ' / / /  Beginn Code Form1.vb
    Public Class Form1
        Private mDT As DataTable
        Private mDV As DataView

        Private WithEvents Combo1 As ComboBox

        Private Sub Form1_Load _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Load

            CreateData()

            Combo1 = New ComboBox
            With Combo1
                .Name = "Combo1"
                .Font = New Font("Arial", 14)

                .SetBounds _
                        (10, 15, _
                         Me.ClientSize.Width - 20, _
                         .Height)

            End With
            Me.Controls.Add(Combo1)
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            With Combo1
                .DisplayMember = "Text"
                .ValueMember = "ID"
                .DataSource = mDV
            End With
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Text", GetType(String))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mDV = mDT.DefaultView
        End Sub

        Private Sub Combo1_SelectedIndexChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Combo1.SelectedIndexChanged

            Dim Buffer As String

            ' Combo1.SelectedItem liefert eine DataRowView
            Dim DRV As DataRowView = _
                    DirectCast(Combo1.SelectedItem, DataRowView)

            Buffer = DRV.Item(0).ToString & "  " & DRV.Item(1).ToString
            Me.Text = Buffer

            Console.WriteLine(ControlChars.CrLf)
            Console.WriteLine("Combo1.SelectedItem: " & Buffer)

            ' Combo1.Text (s. Combo1.DisplayMember)
            Console.WriteLine("Combo1.Text: " & Combo1.Text)

            ' Combo1.Value (s. Combo1.ValueMember)
            Console.WriteLine _
                    ("Combo1.Value: " & _
                     Combo1.SelectedValue.ToString)

        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einer ComboBox
    die über die DataView (mDV) an die DataTable (mDT) gebunden ist.

    Jedesmal, wenn Du einen anderen Eintrag in der ComboBox auswählst,
    werden in der Sub Combo1_SelectedIndexChanged() die von der
    ComboBox bereitgestellten Werte des akt. Datensatzes in die Titelleiste
    der Form bzw. ins Consolfenster geschrieben.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 13. Oktober 2010 06:50
  • Hallo Thorsten,

    danke für die schnelle Antwort! Den Hinweis auf das Anbinden an eine DataView hab ich vergessen - sorry!

    Das Umdrehen hilft wirklich, wobei es eigentlich keinen logischen Sinn ergibt - die Combobox kennt vorm Zuweisen der Datasource die Spaltennamen noch gar nicht... Merkwürdig ist auch, dass ich wenn ich auf der nicht angezeigten TabPage zwei ComboBoxen habe, die eine sich verhält wie geschildert, die andere "normal".  Ich werd jetzt den Code für alle mal so umdrehen und hoffe darauf, dass damit das "Problem" behoben ist.

    Danke und Gruß,
    Torsten

    Freitag, 15. Oktober 2010 17:29
  • Hallo Peter,

    vielen Dank für Deine schnelle und ausführliche Antwort. Das Beispiel macht bei mir genau das was Du schreibst (hab es auch nie angezweifelt). Auch habe ich dem noch ein TabControl mit 2 TabPages, sowie einen Button hinzugefügt. Die Combo1 habe ich dann der 2 TabPages hinzugefügt und auch hier verhält sich alles wie es soll. Sorry, dass ich den Hinweis mit der DataView vergessen hatte.

    Du hast vergessen ComboBox.DisplayMember und evtl. auch
    ComboBox.ValueMember anzugeben:

        ComboBox.DisplayMember = "FeldNameX"
        ComboBox.ValueMember = "FeldNameY"

    DisplayMember und ValueMember waren bei mir wie folgt vorhanden:

    With Me.cboKAri
    .DataSource = mDV_KaRi
    .DisplayMember = "KaRi"
    .ValueMember = "IDtabKaRi
    End With

    Nachdem ich die DataSource hinter DisplayMember und ValueMember verschoben habe, funktioniert es anscheinend.

    With Me.cboKAri<br/><br/>   .DisplayMember = "KaRi"<br/>	.ValueMember = "IDtabKaRi"<br/>	.DataSource = mDV_KaRi<br/>End With<br/>
    

    Ich finde dieses Verhalten sehr merkwürdig, da die ComboBox eigentlich mit den Spaltennamen noch nichts anfangen dürfte, da die DataSource diese erst mitteilt. Ich werd es mal beobachten, ob das jetzt wirklich dauerhaft das Problem behebt...

    Gruß, Torsten

     

    Freitag, 15. Oktober 2010 17:50