Announcement

Collapse
No announcement yet.

ToolStripComboBox und BindingSource?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ToolStripComboBox und BindingSource?

    Hallo liebes Forum,

    kann man ein BindingSource-Steuerelement an eine ToolStripComboBox binden? Wenn ja - wie?

    Gruß Christian

  • #2
    Hallo,

    die ToolStripComboBox ist an und für sich eine normale ComboBox die für das ToolStrip angepasst wurde.

    Um aber damit wie mit einer ComboBox zu arbeiten kann über die ComboBox-Eigenschaft auf die zugrunde liegende ComboBox zugegriffen werden.

    Ein Beispiel:
    [highlight=vbnet]
    Imports System
    Imports System.Collections.Generic
    Imports System.Windows.Forms

    Namespace WindowsFormsApplication1
    Public Partial Class Form1
    Inherits Form
    Private bindingSource1 As New BindingSource()

    Public Sub New()
    InitializeComponent()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs)
    ' BindingSource:
    bindingSource1.DataMember = "MyItems"
    bindingSource1.DataSource = New MyList()

    ' Auf die ComboBox der ToolStripComboBox kann über die
    ' ComboBox-Eigenschaft zugegriffen werden:
    Dim cmb As ComboBox = toolStripComboBox1.ComboBox

    ' Datenquelle für die ComboBox setzten -> gleich wie
    ' bei jeder ComboBox:
    cmb.ValueMember = "ID"
    cmb.DisplayMember = "Name"
    cmb.DataSource = bindingSource1
    End Sub
    End Class

    Public Class MyList
    Public Property MyItems() As List(Of MyItem)
    Get
    End Get
    Set
    End Set
    End Property

    Public Sub New()
    Me.MyItems = New List(Of MyItem)()

    Dim myItem As New MyItem()
    myItem.ID = 1
    myItem.Name = "Günther"
    Me.MyItems.Add(myItem)

    myItem = New MyItem()
    myItem.ID = 2
    myItem.Name = "Andrea"
    Me.MyItems.Add(myItem)
    End Sub
    End Class

    Public Class MyItem
    Public Property ID() As Integer
    Get
    End Get
    Set
    End Set
    End Property
    Public Property Name() As String
    Get
    End Get
    Set
    End Set
    End Property
    End Class
    End Namespace
    [/highlight]

    mfG Gü
    Zuletzt editiert von gfoidl; 22.10.2008, 16:35. Reason: Falsch von C# nach VB.net übersetzt
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke, Gü!

      Gruß
      Christian

      Comment


      • #4
        Noch ne kleine allgemein gültige Anmerkung:

        Beim Binden einer Datenquelle ist es effizienter zuerst die Display- und ValueMember-Eigenschaft zu setzen und dann die Datenquelle.

        Umgekehrt wird beim Setzen der Display-/ValueMember-Eigenschaft jeweils ein ListChanged-Ereignis ausgelöst.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          BindingSource.CurrentChanged - Ereignis

          Hallo Gü,

          ich habe im Form.Load-Ereignis

          Code:
          ..
          meineSicht = New  DataView( _
          Me.MeinDataSet.Tables _
          ("tblMeinDataTable1"), _
          "boolSpalteIstWahr = 'true'", _
          "SortierSpalte", _
          DataViewRowState.CurrentRows)
           
          With Me.ToolStripComboBoxBindingSource
           .DataSource = meineSicht.Table
          End With
          
          With Me.ToolStripComboBox.ComboBox
           .DataSource = Me.ToolStripComboBoxBindingSource
           .DisplayMember = "Name"
           .ValueMember = "IndexGuid"
          End With
          
          pIndexGuid = CType(Me.ToolStripComboBox.ComboBox.SelectedValue, _
          System.Guid)
          'pIndexGuid ist der Parameter-Wert für die FillBy-Abfrage des TableAdapters zum Befüllen eines DataGridView-Steuerelements
          ...
          weiters habe ich

          Code:
          Private  pIndexGuid  As System.Guid
          Private myDataRowViewDataTable As DataRowView
           
          Private Sub ToolStripComboBoxBindingSource_CurrentChanged(..) _
          Handles ..
          If Me.JagdgebietToolStripComboBox.Selected = True Then
          myDataRowViewDataTable = CType(Me.tblDataTableBindingSource.Current, DataRowView)
          pIndexGuid = CType(myDataRowViewDataTable.Item("IndexGuid"), System.Guid)
          Me.fnDataGridViewDataChange(pIndexGuid)
          End If
          End Sub
          
          funktioniert soweit ganz brauchbar - bis auf den Schönheitsfehler:

          Wenn in der ToolStripComboBox ein neues Item mit der "Auto-Vervollständigen - Funktion per Tastatur ausgewählt und statt mit "Enter" die "TAB"-Taste zum Abschließen verwendet wird - dann wird leider weder das BindingSource.CurrentChanged-Ereignis noch das ToolStripComboBox.SelectedIndexChanged-Ereignis ausgelöst!

          Was tun?

          Gruß Christian

          Comment


          • #6
            Hi,

            Enter funktioniert bei mir immer, TAB nur wenn der Fokus von einem ToolStripMenuItem zum nächsten ToolStripMenuItem springt.

            Möglich wäre zu Prüfen ob TAB gedrückt wird und wenn ja -> Enter simulieren.

            Um meinem vorigen Post zu berücksichtigen:
            [highlight=vbnet]
            With Me.ToolStripComboBox.ComboBox
            .DisplayMember = "Name"
            .ValueMember = "IndexGuid"
            .DataSource = Me.ToolStripComboBoxBindingSource
            End With
            [/highlight]

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Hallo Gü,

              nochmals danke, - du bist einfach zu schnell beim Antworten! Während ich meine zweite Frage forumuliert habe, hast du mir die Anregung mit der Reihenfolge für .ValueMember, .DisplayMember und .DataSource geschickt -

              Deshalb die vermeintliche "Ignoranz"!

              (Ich würde niemals wagen des Meisters Worte zu ignorieren! )

              Danke und liebe Grüsse
              Christian

              Comment

              Working...
              X