2010-01-08 3 views
4

J'ai créé un contrôle utilisateur personnalisé qui possède plusieurs propriétés. On spécifie quelle base de données je veux que le contrôle accède. Je veux être en mesure de présenter à l'utilisateur du contrôle une liste déroulante à partir de laquelle il peut sélectionner la base de données avec laquelle le contrôle va interagir.Création d'une liste déroulante de valeurs de propriété valides pour un contrôle personnalisé

Comment faire fonctionner la liste déroulante? Je peux obtenir des valeurs par défaut, mais je n'ai pas encore compris comment obtenir la liste sélectionnable.

Toute aide est appréciée.

Merci.

Marshall

Répondre

0

Voici le modèle que j'utilise pour créer une source de données personnalisée pour mes comboboxes:

Private Class Listing 

    Private _List As New ArrayList 

    Public Sub Add(ByVal ItemNumber As Integer, ByVal ItemName As String) 

     _List.Add(New dataItem(ItemNumber, ItemName)) 

    End Sub 

    Public ReadOnly Property List() As ArrayList 
     Get 
      Return _List 
     End Get 
    End Property 

End Class 

Private Class dataItem 
    Private _ItemNumber As Integer 
    Private _ItemName As String 

    Public Sub New(ByVal intItemNumber As Integer, ByVal strItemName As String) 
     Me._ItemNumber = intItemNumber 
     Me._ItemName = strItemName 
    End Sub 

    Public ReadOnly Property ItemName() As String 
     Get 
      Return _ItemName 
     End Get 
    End Property 

    Public ReadOnly Property ItemNumber() As Integer 
     Get 
      Return _ItemNumber 
     End Get 
    End Property 

    Public ReadOnly Property DisplayValue() As String 

     Get 
      Return CStr(Me._ItemNumber).Trim & " - " & _ItemName.Trim 
     End Get 

    End Property 

    Public Overrides Function ToString() As String 

     Return CStr(Me._ItemNumber).Trim & " - " & _ItemName.Trim 

    End Function 

End Class 

Et voilà comment je le charge:

ListBindSource = New Listing 

    Me.BindingSource.MoveFirst() 
    For Each Row As DataRowView In Me.BindingSource.List 
     Dim strName As String = String.Empty 
     Dim intPos As Integer = Me.BindingSource.Find("Number", Row("Number")) 
     If intPos > -1 Then 
      Me.BindingSource.Position = intPos 
      strName = Me.BindingSource.Current("Name") 
     End If 
     ListBindSource.Add(Row("Number"), strName) 
    Next 

    cboNumber.DataSource = ListBindSource.POList 
    cboNumber.DisplayMember = "DisplayValue" 
    cboNumber.ValueMember = "Number" 
    AddHandler cboNumber.SelectedIndexChanged, AddressOf _ 
      cboNumber_SelectedIndexChanged 

Hope this helps. Une chose à garder à l'esprit est que si cboNumber a un gestionnaire déjà assigné à l'événement SelectedIndexchanged, vous rencontrerez des problèmes. Donc, ne créez pas un événement par défaut.

0

Je suis un peu confus au sujet de votre problème.

Si votre contrôle utilisateur contient un contrôle DropDownList, il suffit d'initialiser quelque part dans le contrôle utilisateur. Le moyen le plus simple est dans Codebehind pour usercontrol, juste DropDownList.Items.Add() ou n'importe quelle syntaxe est pour ajouter un élément.

+0

Je ne parle pas d'utiliser un combobox dans le contrôle utilisateur lui-même. Je parle de l'utiliser dans la boîte de propriétés pour le contrôle. J'ai une propriété pour laquelle je veux restreindre les valeurs valides. J'ai déjà vu des listes déroulantes dans la page de propriétés et j'essaie de reproduire ce comportement. – Marshall

3

Vous avez juste besoin d'attacher votre propre TypeConverter à votre propriété. Vous remplacerez les méthodes GetStandardValuesSupported et GetStandardValues ​​ (peut-être GetStandardValuesExclusive aussi) pour renvoyer la liste des bases de données que vous souhaitez afficher.

Si vous êtes nouveau dans PropertyGrid et TypeConverter, voici un document.

1

Il s'avère plus simple que je ne le pensais.

J'avais une énumération configurée pour la propriété, mais j'avais du mal à l'utiliser pour le type de propriété. Dit qu'il était inaccessible en dehors de la classe.

Puis j'ai eu un moment 'duh' et j'ai changé l'énumération de Friend en Public, puis j'ai pu utiliser l'énumération comme type de propriété. Par conséquent, les valeurs de l'énumération sont répertoriées dans une liste déroulante lorsque je regarde les valeurs de cette propriété des contrôles.

Merci à tous ceux qui ont répondu.

Marshall

+0

Il serait très interressant pour moi de savoir comment afficher la valeur recommandée dans la liste déroulante. Dans mon cas, je voudrais les extraire d'une base de données. – Larry

+0

Si je veux des valeurs dynamiques alors que dois-je faire? Les valeurs proviennent d'un fichier de classe, mais je ne peux pas en faire l'énumération. – Krunal

+0

Merci, votre réponse m'a beaucoup aidé! – Magnus

Questions connexes