none
ComboBox mit Daten aus einer Tabelle füllen ! RRS feed

  • Frage

  • Hi Leute mal wieder ne Frage zur ComBoBox,

    habe folgende Daten aus einer Datenbank gelesen.

       Public Sub BoxLesen()
    
    
    
            sql = "Select * from BOX WHERE ID = ""Ort""  "
    
    
    
    ) 
    
            selectBox = New OleDbCommand(sql, conn)
    
    
    
            daBox = New OleDbDataAdapter(selectBox)
    
    
    
            Dim dsBox As New DataSet
    
    
    
            daBox.Fill(dsBox, "BOX")
    
    
    
            dtBox = dsBox.Tables("BOX")
    
    
    
            Dim ORT1 As String
    
            Dim rowbox As DataRow
    
    
    
            rowbox = dtBox.Rows(0)
    
    
    
            ORT1 = rowbox.Item("feld1")
    
            ComboBox2.Items.Add(ORT1)
    
    
    
            ORT1 = rowbox.Item("feld2")
    
            ComboBox2.Items.Add(ORT1)
    
    
    
            ORT1 = rowbox.Item("feld3")
    
            ComboBox2.Items.Add(ORT1)
    
    
    
            ORT1 = rowbox.Item("feld4")
    
            ComboBox2.Items.Add(ORT1)
    
    
    
    
    
    
    
    
    
    
    
            ' conn.Close()
    
        End Sub
    
    
    Funktioniert so auch ABER ich würde gerne die ComBoBox DIREKT mit den Daten der Tabelle/Datenbank füllen anstatt dafür
    ORT1 = rowbox.Item("feld2")
    ComboBox2.Items.Add(ORT1)
    
    verwenden zu müssen !
    Klapt wohl irgenwei mit Binding aber ich hab nix gefunden das mir das in VB erklärt ?

    Irgend jemand ne Ahnung wo ich darüber was finde ! (aber bitte kein C# )
    Danke
    Dienstag, 22. Dezember 2009 10:21

Antworten

  • Hi,

    Du solltest die Combo an ein Objekt binden, das wiederum durch Deinen Code bereitgestellt wird. Beispiel:

    <Window x:Class="ComboBoundToDataTable"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="ComboBoundToDataTable" 
            SizeToContent="WidthAndHeight">
        <Grid>
          <ComboBox ItemsSource="{Binding CustomersDataTable}">
             <ComboBox.ItemTemplate>
                <DataTemplate>
                   <TextBlock Text="{Binding Path=CompanyName}" />
                </DataTemplate>
             </ComboBox.ItemTemplate>
          </ComboBox>
       </Grid>
    </Window>
    

    Und der code-behind:

    Option Explicit On
    Option Strict On
    
    Imports System.Data
    Imports System.Data.SqlClient
    
    Partial Public Class ComboBoundToDataTable
    
       Private _dt As DataTable = Nothing
       Public ReadOnly Property CustomersDataTable() As DataView
          Get
             If _dt Is Nothing Then
                Try
                   _dt = New DataTable
                   Using cn As New SqlConnection(My.Settings.DB)
                      cn.Open()
                      Using cmd As New SqlCommand( _
                            "SELECT Co.CustomerID, Co.CompanyName " & _
                            "FROM dbo.Customers AS Co " & _
                            "ORDER BY Co.CompanyName", _
                            cn _
                         )
                         Using da As New SqlDataAdapter(cmd)
                            da.Fill(_dt)
                         End Using
                      End Using
                   End Using
                Catch ex As Exception
                   MessageBox.Show("Fehler: " & ex.Message)
                End Try
             End If
             Return _dt.DefaultView
          End Get
       End Property
    
       Private Sub ComboBoundToDataTable_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
          Me.DataContext = Me
       End Sub
    
    End Class
    

    Obiges Beispiel verwendet die Customer-Tabelle der Northwind-DB (der ConnectionString ist als App-Setting "DB" definiert). Für's Beispiel werden 2 Spalten in die DataTable geholt (ID + Name), aber von der CBO wird nur der Name vewendet. Der Rest sollte selbsterklärend sein, hoffe ich ... :-)

    Gruß,
    Olaf
    Dienstag, 22. Dezember 2009 16:11

Alle Antworten

  • Hi,

    Du solltest die Combo an ein Objekt binden, das wiederum durch Deinen Code bereitgestellt wird. Beispiel:

    <Window x:Class="ComboBoundToDataTable"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="ComboBoundToDataTable" 
            SizeToContent="WidthAndHeight">
        <Grid>
          <ComboBox ItemsSource="{Binding CustomersDataTable}">
             <ComboBox.ItemTemplate>
                <DataTemplate>
                   <TextBlock Text="{Binding Path=CompanyName}" />
                </DataTemplate>
             </ComboBox.ItemTemplate>
          </ComboBox>
       </Grid>
    </Window>
    

    Und der code-behind:

    Option Explicit On
    Option Strict On
    
    Imports System.Data
    Imports System.Data.SqlClient
    
    Partial Public Class ComboBoundToDataTable
    
       Private _dt As DataTable = Nothing
       Public ReadOnly Property CustomersDataTable() As DataView
          Get
             If _dt Is Nothing Then
                Try
                   _dt = New DataTable
                   Using cn As New SqlConnection(My.Settings.DB)
                      cn.Open()
                      Using cmd As New SqlCommand( _
                            "SELECT Co.CustomerID, Co.CompanyName " & _
                            "FROM dbo.Customers AS Co " & _
                            "ORDER BY Co.CompanyName", _
                            cn _
                         )
                         Using da As New SqlDataAdapter(cmd)
                            da.Fill(_dt)
                         End Using
                      End Using
                   End Using
                Catch ex As Exception
                   MessageBox.Show("Fehler: " & ex.Message)
                End Try
             End If
             Return _dt.DefaultView
          End Get
       End Property
    
       Private Sub ComboBoundToDataTable_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
          Me.DataContext = Me
       End Sub
    
    End Class
    

    Obiges Beispiel verwendet die Customer-Tabelle der Northwind-DB (der ConnectionString ist als App-Setting "DB" definiert). Für's Beispiel werden 2 Spalten in die DataTable geholt (ID + Name), aber von der CBO wird nur der Name vewendet. Der Rest sollte selbsterklärend sein, hoffe ich ... :-)

    Gruß,
    Olaf
    Dienstag, 22. Dezember 2009 16:11
  • Hallo WPF_Lernen,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Freitag, 25. Dezember 2009 22:11
    Moderator