Benutzer mit den meisten Antworten
[VB 2005] ComboBox auf TabControl gibt Text nicht her

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
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 13. Oktober 2010 08:36
- Als Antwort markiert Torsten Runge Freitag, 15. Oktober 2010 17:29
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 13. Oktober 2010 08:36
- Als Antwort markiert Torsten Runge Freitag, 15. Oktober 2010 17:29
-
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 = DVDie 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 DataViewPrivate WithEvents Combo1 As ComboBox
Private Sub Form1_Load _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.LoadCreateData()
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 SubPrivate Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ShownWith Combo1
.DisplayMember = "Text"
.ValueMember = "ID"
.DataSource = mDV
End With
End SubPrivate Sub CreateData()
Dim i As Integer
Dim DR As DataRowmDT = 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 WithmDV = mDT.DefaultView
End SubPrivate Sub Combo1_SelectedIndexChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Combo1.SelectedIndexChangedDim 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 = BufferConsole.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 ENach 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)- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 13. Oktober 2010 08:36
-
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 -
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 WithNachdem 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