2017-07-24 2 views
0

Ich habe ein einfaches Formular, das DataBinding verwendet, um an eine Objektgruppe zu binden. Zunächst möchte ich nicht, dass die ComboBox eine Auswahl anzeigt, also setze ich den ausgewählten Index auf -1. Wenn die ComboBox jedoch ausgewählt wird, kann ich sie nicht abwählen, ohne einen Wert auszuwählen.ComboBox mit Bindung an SeclectedItem kann die Auswahl nicht ändern

Wie kann ich die ComboBox abwählen (andere Steuerelemente auswählen), ohne einen Wert auszuwählen?

neu zu erstellen, eine neue winform zu schaffen, eine ComboBox und einen Text hinzufügen, dann diesen Code verwenden:

Imports System.Collections.Generic 

Public Class Form1 

    Public Property f As Person 

    Public Sub New() 
     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Dim db As New People 
     ' ComboBox1.CausesValidation = False 
     ComboBox1.DataSource = db 
     ComboBox1.DisplayMember = "Name" 
     ComboBox1.DataBindings.Add("SelectedItem", Me, "f", False, DataSourceUpdateMode.OnPropertyChanged) 
     ComboBox1.SelectedIndex = -1 
    End Sub 

End Class 

Public Class Person 
    Public Property Name As String 
End Class 

Public Class People 
    Inherits List(Of Person) 

    Public Sub New() 
     Me.Add(New Person With {.Name = "Dave"}) 
     Me.Add(New Person With {.Name = "Bob"}) 
     Me.Add(New Person With {.Name = "Steve"}) 
    End Sub 
End Class 

Wenn die Form der ComboBox beginnt ausgewählt werden sollte, und es ist nicht möglich, die TextBox auszuwählen.

Ich habe festgestellt, dass das Umschalten von CausesValidation auf False auf der ComboBox das Problem behebt, aber es bricht die DataBinding.

+1

glaube, ich Liste gebunden 'ComboBox' (und allgemeiner' ListControl') kann nicht abgewählt werden, da 'CurrencyManager' nicht die' Position' Einstellung erlaubt, wenn auf -1 die zugrunde liegende Liste 'Count'> 0 –

+0

Problemumgehung Fügen Sie ein NONE-Objekt mit ungültigem Wert hinzu. – Ramankingdom

+0

Dem Benutzer zu erlauben, einen ungültigen Wert auszuwählen, ist keine gute Lösung –

Antwort

1

Eine Lösung gefunden! (Danke Ivan!)

Wenn die ComboBox als SelectedIndex von -1, wenn es Validieren ist, deaktivieren Sie die Bindung vorübergehend.

 AddHandler ComboBox1.Validating, AddressOf DisableBindingWhenNothingSelected 
     AddHandler ComboBox1.Validated, AddressOf DisableBindingWhenNothingSelected 

    ''' <summary> 
    ''' Temporarily disables binding when nothing is selected. 
    ''' </summary> 
    ''' <param name="sender">Sender of the event.</param> 
    ''' <param name="e">Event arguments.</param> 
    ''' <remarks>A list bound ComboBox (and more generically ListControl) cannot be deselected, 
    ''' because CurrencyManager does not allow setting the Position to -1 when the underlying list Count is > 0. 
    ''' This should be bound to the Validating and Validated events of all ComboBoxes that have an initial SelectedIndex of -1.</remarks> 
    Protected Sub DisableBindingWhenNothingSelected(sender As Object, e As EventArgs) 
     Dim cb As ComboBox = DirectCast(sender, ComboBox) 
     If cb.SelectedIndex = -1 Then 
      If (cb.DataBindings.Count = 0) Then Exit Sub 
      If cb.DataBindings(0).DataSourceUpdateMode = DataSourceUpdateMode.Never Then 
       cb.DataBindings(0).DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged 
      Else 
       cb.DataBindings(0).DataSourceUpdateMode = DataSourceUpdateMode.Never 
      End If 
     End If 
    End Sub 
Verwandte Themen