Label dynamisch zur Auswahl einer Combobox ändern

18/09/2008 - 11:21 von Stephan Riedrich | Report spam
Hallo, ich nochmal mit einer weiteren Frage. In einem Tutorial habe ich ein
Beispiel gefunden, welches auch Anwendung in meinem Programm spielen soll.

Dabei geht es um folgendes.

Ich habe eine DB-Tabelle mit 3 Spalten, ID (Autoincrement), Datum und
Beschreibung.
Nun habe ich eine Form mit einer Combobox und einem Label. In der Combobox
sollen alle Elemente der Spalte "Beschreibung" aus der Tabelle angezeigt
werden. Im Label soll wàhrend der Laufzeit das jeweilige Datum zur passend in
der Combobox ausgewàhlten Beschreibung erscheinen.

Das ist der visuelle Teil, also das mit dem Label muss nicht sein, aber es
hilft der Übersicht, wenn mehrere Beschreibungen gleich sind, kann ich
immernoch mit dem Datum die richtige rausfinden. Nun kommt noch ein Problem
im aktiven Teil der Anwendung... Wenn ich nun auf einen Button klicke, soll
die passende ID zur ausgewàhlten Beschreibung als Variable gespeichert werden
und das Form dann geschlossen werden.

Den Quelltext für das Füllen der Combobox habe ich aus dem Beispiel
übernommen. Funktioniert auch soweit...

////Code

Imports MySql.Data.MySqlClient

Public Class spielladen

Private myConnString As String

Public WriteOnly Property connectionString() As String
Set(ByVal value As String)
myConnString = value
End Set
End Property

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

Dim conn As New MySqlConnection
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As New DataTable
Dim SQL As String

SQL = "SELECT id, datum, beschreibung from savegames"

conn.ConnectionString = myConnString

Try
conn.Open()

Try
myCommand.Connection = conn
myCommand.CommandText = SQL

myAdapter.SelectCommand = myCommand
myAdapter.Fill(myData)

comboboxbeschreibung.DataSource = myData
comboboxbeschreibung.DisplayMember = "beschreibung"
comboboxbeschreibung.ValueMember = "id"

Catch myerror As MySqlException
MsgBox("There was an error reading from the database: " &
myerror.Message)
End Try
Catch myerror As MySqlException
MessageBox.Show("Error connecting to the database: " &
myerror.Message)
Finally
If conn.State <> ConnectionState.Closed Then conn.Close()
End Try

End Sub

Private Sub cmdcancel_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdcancel.Click

Me.Close()

End Sub
End Class

Code////

Was muß ich nun machen, damit in label1.text das jeweilige Datum auftaucht?
Und wie übergebe ich schlussendlich die ID an meine Variable um damit
weiterarbeiten zu können.

MfG Stephan
 

Lesen sie die antworten

#1 Peter Götz
18/09/2008 - 13:07 | Warnen spam
Hallo Stephan,

Ich habe eine DB-Tabelle mit 3 Spalten, ID (Autoincrement),
Datum und Beschreibung.
Nun habe ich eine Form mit einer Combobox und einem
Label. In der Combobox sollen alle Elemente der Spalte
"Beschreibung" aus der Tabelle angezeigt werden.
Im Label soll wàhrend der Laufzeit das jeweilige Datum
zur passend in der Combobox ausgewàhlten Beschreibung
erscheinen.

Das ist der visuelle Teil, also das mit dem Label muss nicht
sein,



Damit ist kein wirklicher Aufwand verbunden.
Ob es dem Benutzer hilft, kann ich nicht beurteilen.

aber es hilft der Übersicht, wenn mehrere Beschreibungen
gleich sind, kann ich immernoch mit dem Datum die richtige
rausfinden.



Und wenn es zwei oder mehrere DS mit gleicher
Beschreibung und gleichem Datum gibt?


Nun kommt noch ein Problem
im aktiven Teil der Anwendung... Wenn ich nun auf
einen Button klicke, soll die passende ID zur ausgewàhlten
Beschreibung als Variable gespeichert werden
und das Form dann geschlossen werden.



In welcher Variablen denn?
Wie und wo hast Du diese Variable deklariert?
Gibt es ausser der Form, welche Du eben schliessen
willst, noch weitere Forms oder andere Klassen?

Den Quelltext für das Füllen der Combobox habe ich
aus dem Beispiel übernommen.
Funktioniert auch soweit...

////Code

Imports MySql.Data.MySqlClient

Public Class spielladen

Private myConnString As String

Public WriteOnly Property connectionString() As String
Set(ByVal value As String)
myConnString = value
End Set
End Property

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

Dim conn As New MySqlConnection
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As New DataTable
Dim SQL As String

SQL = "SELECT id, datum, beschreibung from savegames"

conn.ConnectionString = myConnString

Try
conn.Open()



Es ist keine gute Idee, eine Connection im Form_Load-
Ereignis zu öffnen. Das Öffnen einer Connection kann u.U.
relativ viel Zeit in Anspruch nehmen. In dieser Zeit ist
Deine Anwendung blockiert, die Form ist noch nicht sicht-
bar und der Benutzer sieht erst mal gar nichts und weiss
auch nicht, ob das Programm noch was tut oder ein-
geschlafen ist.

... schnipp ...

Was muß ich nun machen, damit in label1.text das
jeweilige Datum auftaucht?
Und wie übergebe ich schlussendlich die ID an meine
Variable um damit weiterarbeiten zu können.



Das mit Deiner Variablen, solltest Du mal etwas
verstàndlicher beschreiben, vor allem wie und wo
diese Variable deklariert ist.

Ansonsten schau Dir mal das nachfolgende Beispiel
an. Das sollte eigentlich alle evtl. auftauchenden
Fragen beantworten.

' /// Code in einer leeren Form1
Public Class Form1
Private Label1 As Label
Private WithEvents ComboBox1 As ComboBox
Private mDT As DataTable

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

CreateControls()
CreateData()
With ComboBox1
.DataSource = mDT.DefaultView
.DisplayMember = "Text"
.ValueMember = "ID"
End With
End Sub

Private Sub CreateControls()
Label1 = New Label
With Label1
.Font = New Font("Arial", 8, FontStyle.Bold)
.AutoSize = True
.Name = "Label1"
.Text = .Name
.Anchor = AnchorStyles.Left Or AnchorStyles.Top
.Location = New Point(10, 10)
End With
Me.Controls.Add(Label1)

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

.SetBounds _
(10, _
Label1.Bottom + 2, _
Me.ClientSize.Width - 20, _
.Height)

.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right

.DropDownStyle = ComboBoxstyle.DropDownLIst
End With
Me.Controls.Add(ComboBox1)
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
Dim Rnd As New Random(Now.Millisecond)
Dim TextArray() As String = _
New String() _
{"Hund", "Katze", "Maus", "Elefant", _
"Tiger", "Nashorn", "Nilpferd", "Kuh", _
"Schaf"}


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

For i = 0 To TextArray.GetUpperBound(0)
DR = .NewRow
DR.Item(0) = i

DR.Item(1) = _
New Date _
(2008, 1, 1).AddDays(Rnd.Next(1, 500))

DR.Item(2) = TextArray(i)

.Rows.Add(DR)
Next
End With
End Sub

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

If ComboBox1.SelectedItem IsNot Nothing Then
Dim Fmt As String = "dd.MM.yyyy"
Dim DRV As DataRowView = _
DirectCast(ComboBox1.SelectedItem, DataRowView)

Label1.Text = Format(DRV.Item(1), Fmt)

' Zugriff auf die zu DRV gehörende
' DataRow der DataTable mDT
Dim DR As DataRow = DRV.Row
Dim strBuffer As String = ""
With DR
strBuffer &= .Item(0).ToString & "; " & _
Format(.Item(1), Fmt) & "; " & _
.Item(2).ToString

Me.Text = strBuffer
End With
End If
End Sub
End Class
' \\\ E N T E

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

Ähnliche fragen