Datatable als Source für Combo - Problem

07/08/2008 - 08:47 von Thomas Hübner | Report spam
Hi NG,

Ich hole mir mit einem Dataadapter eine Spalte aus einer MDB und fülle
eine Datatable. Diese DT ist Datasource für eine Combobox (Display
Member = Spalte). Nach dem anbinden der Datsource setze ich sofort den
Listindex auf 0. Wenn ich im nàchsten Schritt mir combobox.Text holen
möchte bekomme ich ein Objekt zurück (glaube Datarow(item)) was zu einer
Ausnahme führt da ich ja string erwarte. Lasse ich eine Weile vergehen
bekomme ich string (wie erwartet)
Das gleiche Verhalten beobachte ich bei einer Listbox. Selbst in dem
moment wo SelectedIndexChanged gefeuert wird steht noch kein String
drin. Muß man, wenn man sofort mit dem .Text weiterarbeiten will immer
diese Ausnahme abfangen (dann ist ja das Event weg) oder krieg ich
woanders die Info "combobox/ Listbox einsatzbereit"? Vor allem - kann
das jemand nachvollziehen?

Gruß,
Thomas
 

Lesen sie die antworten

#1 Peter Götz
07/08/2008 - 14:08 | Warnen spam
Hallo Thomas,

Ich hole mir mit einem Dataadapter eine Spalte aus einer
MDB und fülle eine Datatable. Diese DT ist Datasource für
eine Combobox (Display Member = Spalte). Nach dem
anbinden der Datsource



Wie genau (Code) sieht dieses Anbinden aus?

setze ich sofort den Listindex auf 0.



Welchen ListIndex?
Eine .net-ComboBox hat keinen ListIndex.
ComboBox.SelectedIndex wàre die entspr. Eigenschaft.


Wenn ich im nàchsten Schritt mir combobox.Text holen
möchte bekomme ich ein Objekt zurück (glaube
Datarow(item))



Die Eigenschaft ComboBox.Text ist als String deklariert
und gibt auch nur einen solchen zurück. Ein DataRow.Item
ist ein Feld eines Datensatzes (Row) einer DataTable
und dieses Objekt wird niemals von ComboBox.Text
geliefert.


was zu einer Ausnahme führt da ich ja string erwarte.
Lasse ich eine Weile vergehen bekomme ich string
(wie erwartet)



Dieses Verhalten ist so unmöglich und auch nicht zu
erklàren. Da machst Du in Deinem Code mit Sicherheit
etwas gànzlich anders als Du es hier beschreibst.

Hier mal ein Beispiel:

' /// Code in einer leeren Form1
Public Class Form1

Private WithEvents CBox As ComboBox
Private mDT As DataTable
Private mDV As DataView
Private mCM As CurrencyManager

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

Dim i As Integer = CBox.SelectedIndex
i += 1
If i > mDT.Rows.Count - 1 Then
i = 0
End If
CBox.SelectedIndex = i
End Sub


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

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

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

.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right
End With
Me.Controls.Add(CBox)

CreateData()

CBox.DataSource = mDV
CBox.DisplayMember = "Mon"
CBox.ValueMember = "ID"
mCM.Position = 0
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("Mon", 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 = New DataView(mDT)

mCM = DirectCast _
(Me.BindingContext(mDV), _
CurrencyManager)
End Sub


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

If CBox.SelectedIndex > -1 Then
Me.Text = CBox.Text
End If
End Sub
End Class
' \\\ E N T E

Progràmmchen starten und wahlweise in der Combo-Liste
eine neue Auswahl treffen oder einfach auf die Form klicken.
CB.Text liefert zu jeder Zeit einen String und niemals ein
Objekt DataRowItem.

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

Ähnliche fragen