2009-09-05 3 views
1

J'ai une liste déroulante contenant les jours de la semaine - du lundi au dimanche. Il est rempli avec un type défini par l'utilisateur de deux valeurs qui mappent le jour numérique de la semaine à son nom.Comment se connecter à une liste déroulante de types définis par l'utilisateur?

Public Structure WeekDays 
    Public ID As Integer 
    Public Text As String 
    Public Overrides Function ToString() As String 
     Return Me.Text 
    End Function 
End Structure 

L'objet je veux de se lier à une propriété entier a DayOfWeek, et je souhaite lier la valeur d'identification de l'élément sélectionné dans la liste déroulante de la propriété DayOfWeek sur l'objet. par exemple. L'utilisateur sélectionne jeudi et l'ID de 4 est transmis à l'objet.

Dans le code, je peux récupérer l'UDT de SelectedItem, mais je ne peux pas déterminer quelle propriété dans la zone de liste déroulante à lier. Si j'ajoute les UDT directement à la collection Items de la liste déroulante, la valeur SelectedValue est Nothing.

  • Si j'ajoute les UDT à une collection List (Of UDT) et définissez cela comme datasource du menu déroulant, avec ValueMember défini sur ID et DisplayMember défini sur Text, SelectedValue renvoie l'intégralité de l'UDT, pas l'ID comme indiqué dans le Propriété ValueMember. La fonction de liaison de données semble très bien fonctionner pour les zones de texte brut, mais elle semble être beaucoup plus complexe dans le cas de contrôles plus complexes.

    Mise à jour: Ce que je cherche, c'est l'instruction Binding. par exemple. Ni ...

    oB = New Binding("SelectedItem", Payroll, "DayOfWeek") 
    oB = New Binding("SelectedItem.ID", Payroll, "DayOfWeek") 
    

    ... fonctionne. Le premier est juste ignoré (peut-être parce que la propriété SelectedItem est Nothing) et le second échoue avec une erreur "Can not bind ...".

  • Répondre

    1

    OK, donc je l'ai trouvé une solution possible.

    J'ai créé mon propre contrôle ComboBox qui hérite du WinForms.ComboBox standard et ajouté une propriété Integer supplémentaire appelée SelectedID.

    Public Structure NumericUDT 
        Public ID As Integer 
        Public Text As String 
    
        Public Sub New(ByVal iID As Integer, ByVal sText As String) 
         Me.ID = iID 
         Me.Text = sText 
        End Sub 
        Public Overrides Function ToString() As String 
         Return Me.Text 
        End Function 
    End Structure 
    
    Public Property SelectedID() As Integer 
        Get 
         Dim uItem As NumericUDT 
         Dim iID As Integer 
    
         If (MyBase.SelectedItem Is Nothing) Then 
          iID = 0 
         Else 
          uItem = DirectCast(MyBase.SelectedItem, NumericUDT) 
          iID = uItem.ID 
         End If 
    
         Return iID 
    
        End Get 
        Set(ByVal value As Integer) 
    
         Dim uItem As NumericUDT 
         Dim uFound As NumericUDT = Nothing 
    
         For Each uItem In MyBase.Items 
          If uItem.ID = value Then 
           uFound = uItem 
           Exit For 
          End If 
         Next 
    
         MyBase.SelectedItem = uFound 
    
        End Set 
    End Property 
    

    Cela me permet de se lier à la propriété SelectedID ...

    oB = New Binding("SelectedID", Payroll, "PayDay") 
    

    ... et semble fonctionner ok.

    +0

    Je vais attendre quelques jours pour voir si une meilleure solution est à venir, sinon j'accepterai cette réponse. – Bill

    1

    Créer des propriétés,

    Public Structure WeekDays 
        Private _ID As Integer 
        Private _Text As String 
        Public Sub New(ByVal ID As Integer, ByVal Text As String) 
         Me._ID = ID 
         Me._Text = Text 
        End Sub 
        Public Overrides Function ToString() As String 
         Return Me._Text 
        End Function 
    
        Public Property ID() As Integer 
         Get 
          Return _ID 
         End Get 
         Set(ByVal value As Integer) 
          _ID = value 
         End Set 
        End Property 
        Public Property Text() As String 
         Get 
          Return _Text 
         End Get 
         Set(ByVal value As String) 
          _Text = value 
         End Set 
        End Property 
    End Structure 
    
    
    Public Class Form1 
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
         Dim items As New List(Of WeekDays) 
    
         items.Add(New WeekDays(1, "A")) 
         items.Add(New WeekDays(2, "B")) 
    
         Dim lb As New ListBox 
         lb.DataSource = items 
         lb.ValueMember = "ID" 
         lb.DisplayMember = "Text" 
         AddHandler lb.SelectedIndexChanged, AddressOf Item_Sel 
    
         Me.Controls.Add(lb) 
    
         TextBox1.DataBindings.Add(New Binding("Text", items, "Text")) 
    
         Dim cb As New ComboBox 
         cb.DataSource = items 
         cb.DisplayMember = "Text" 
         cb.ValueMember = "ID" 
         cb.DataBindings.Add("SelectedValue", items, "ID") 
         cb.Location = New Point(100, 100) 
         Me.Controls.Add(cb) 
         TextBox1.DataBindings.Add(New Binding("Text", items, "ID"))   
        End Sub 
    
        Public Sub Item_Sel(ByVal sender As System.Object, ByVal e As System.EventArgs) 
         Dim obj As Object = CType(sender, ListBox).SelectedValue 
         MsgBox(obj) 
        End Sub 
    End Class 
    
    +0

    Hmmm. Je ne pouvais pas voir pourquoi une propriété fonctionnerait différemment d'un champ public, mais j'ai essayé de toute façon. Après cela n'a pas fonctionné j'ai alors essayé de passer d'un UDT à une classe, et cela n'a pas fonctionné non plus. Je pense que votre exemple fonctionne parce que vous liez la propriété Text (qui existe dans le combo et l'UDT). Je dois être capable de lier à la valeur d'ID, mais l'opération DataBindings.Add ne peut pas trouver une propriété d'ID sur le COMBO et provoque l'erreur. – Bill

    +0

    Non, cela n'a rien à voir avec les propriétés ComboBox. Vous pouvez définir ValueMember et DisplayMember à n'importe quelle propriété publique des éléments de données –

    Questions connexes