Benutzer mit den meisten Antworten
Frage zum ComboBox-Steuerelemnt

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
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
Alle Antworten
-
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
<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.- Bearbeitet Tom Lambert (Koopakiller) Dienstag, 9. April 2013 09:49 C# > VB.NET
-
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