none
Frage zum ComboBox-Steuerelemnt RRS feed

  • Frage

  • Hallo,

    ich möchte bei Wahl eines Eintrages in einem ComboBox-Steuerelement zunächst Prozeduren ausführen, die sich auf das vor der Selektionsänderung gewählten Listeneintrag beziehen. Ich finde leider kein dazu  geeignetes Ereignis. Im TabControll-Steuerelemnt gibt es z.B. das Event "Deselecting", das genau sowas anbietet!

    Wüßte jemand eine Tipp für mich?

    Gruß

    Christoph

    Montag, 8. April 2013 12:41

Antworten

  • Hi Christoph,
    nachfolgend eine Demo in VB, wie ich so etwas mache. Ich nutze eine Datenquelle und komplexe Bindung. Man kann dem Datensatzwechsel folgen und, wenn man das aktuelle Element beispielsweise in einer Eigenschaft ablegt, auch den vorherigen Zustand bzw. Wert auswerten.

    Public Class Form1
    
      Private cb As New ComboBox With {.Dock = DockStyle.Top, .DisplayMember = "col1"}
      Dim bs As New BindingSource
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Steuerelemente anzeigen
        Me.Controls.AddRange(New Control() {cb})
        ' Positionsänderungen ablegen
        AddHandler Me.bs.CurrentChanged, Sub()
                                           Me.CurrentItem = DirectCast(Me.bs.Current, DataRowView)
                                         End Sub
        Me.bs.DataSource = Me.GetData()
        ' Datenquelle an Steuerelement binden 
        Me.cb.DataSource = Me.bs
      End Sub
    
      Private _currentItem As DataRowView
      Public Property CurrentItem As DataRowView
        Get
          Return Me._currentItem
        End Get
        Set(value As DataRowView)
          If Me._currentItem IsNot value Then
            If Me._currentItem Is Nothing Then
              Trace.WriteLine("kein alter Wert")
            Else
              Trace.WriteLine(String.Format("alter Wert: {0}, neuer Wert: {1}", Me._currentItem("col1"), value("col1")))
            End If
            Me._currentItem = value
          End If
        End Set
      End Property
    
      Private Function GetData() As DataTable
        Dim dt As New DataTable
        With dt
          With ..Columns
            .Add("col1", GetType(String))
          End With
          For i = 1 To 10
            Dim r = .NewRow
            r(0) = "Zeile " & i.ToString
            .Rows.Add(r)
          Next
        End With
        Return dt
      End Function
    
    End Class
    

    --
    Viele Gruesse
    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Sonntag, 28. April 2013 20:15
    • Als Antwort markiert Ionut Duma Dienstag, 7. Mai 2013 13:38
    Dienstag, 9. April 2013 04:32

Alle Antworten

  • Hi Christoph,

    mir fällt da jetzt auch kein passendes Event für ein.

    Mein Vorschlag wäre den zuletzt ausgewählten Eintrag einfach in einer Variable zwischen zu speichern.

    MFG

    Björn

    Montag, 8. April 2013 13:34
  • Hallo, mir ist auch kein Event dafür bekannt. Ich habe mal Palins Vorschlag in eine eigene Klasse gepackt:
    Public Partial Class Form1
     Inherits Form
     Public Sub New()
      InitializeComponent()
     End Sub

     Private Sub comboBoxEx1_PreSelectedIndexChanged(sender As Object, e As ValueChangedEventArgs(Of Integer))

     End Sub
    End Class

    Public Class ComboBoxEx
     Inherits ComboBox
     Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)
      MyBase.OnSelectedIndexChanged(e)
      Dim v = PreSelectedIndexChanged
      RaiseEvent v(Me, New ValueChangedEventArgs(Of Integer)(_PreSelectedIndex, Me.SelectedIndex))
      _PreSelectedIndex = Me.SelectedIndex
     End Sub

     Private _PreSelectedIndex As Integer = 0

     Public Event PreSelectedIndexChanged As EventHandler(Of ValueChangedEventArgs(Of Integer))
    End Class

    Public Class ValueChangedEventArgs(Of T)
     Inherits EventArgs
     ReadOnly oldValue As T
     ReadOnly newValue As T
     Public Sub New(oldValue As T, newValue As T)
      Me.oldValue = oldValue
      Me.newValue = newValue
     End Sub
    End Class 
    Das lohnt sich meiner Meinung nach schon wenn man nur 2 ComboBoxen mit dieser speziellen Eigenschaft braucht.


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.


    Montag, 8. April 2013 16:21
  • Hi Christoph,
    nachfolgend eine Demo in VB, wie ich so etwas mache. Ich nutze eine Datenquelle und komplexe Bindung. Man kann dem Datensatzwechsel folgen und, wenn man das aktuelle Element beispielsweise in einer Eigenschaft ablegt, auch den vorherigen Zustand bzw. Wert auswerten.

    Public Class Form1
    
      Private cb As New ComboBox With {.Dock = DockStyle.Top, .DisplayMember = "col1"}
      Dim bs As New BindingSource
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Steuerelemente anzeigen
        Me.Controls.AddRange(New Control() {cb})
        ' Positionsänderungen ablegen
        AddHandler Me.bs.CurrentChanged, Sub()
                                           Me.CurrentItem = DirectCast(Me.bs.Current, DataRowView)
                                         End Sub
        Me.bs.DataSource = Me.GetData()
        ' Datenquelle an Steuerelement binden 
        Me.cb.DataSource = Me.bs
      End Sub
    
      Private _currentItem As DataRowView
      Public Property CurrentItem As DataRowView
        Get
          Return Me._currentItem
        End Get
        Set(value As DataRowView)
          If Me._currentItem IsNot value Then
            If Me._currentItem Is Nothing Then
              Trace.WriteLine("kein alter Wert")
            Else
              Trace.WriteLine(String.Format("alter Wert: {0}, neuer Wert: {1}", Me._currentItem("col1"), value("col1")))
            End If
            Me._currentItem = value
          End If
        End Set
      End Property
    
      Private Function GetData() As DataTable
        Dim dt As New DataTable
        With dt
          With ..Columns
            .Add("col1", GetType(String))
          End With
          For i = 1 To 10
            Dim r = .NewRow
            r(0) = "Zeile " & i.ToString
            .Rows.Add(r)
          Next
        End With
        Return dt
      End Function
    
    End Class
    

    --
    Viele Gruesse
    Peter

    • Als Antwort vorgeschlagen Peter Fleischer Sonntag, 28. April 2013 20:15
    • Als Antwort markiert Ionut Duma Dienstag, 7. Mai 2013 13:38
    Dienstag, 9. April 2013 04:32
  • Hallo Christoph,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut

    Dienstag, 7. Mai 2013 13:38