2009-11-15 4 views
0

J'essaie de construire une application VB.Net pilotée par base de données qui tire une liste de comptes enregistrés à partir d'une base de données et affiche les noms d'utilisateur des comptes throes dans le menu, de sorte que l'utilisateur peut sélectionner et un nouveau formulaire ouvert (où ils travaillent avec).menus de base de données dynamiques dans VB.Net

ce que j'ai à ce jour est le constructeur de la fenêtre parent MDI

Public Sub New() 

    InitializeComponent() 

    Dim tsmi As New ToolStripMenuItem("Users", Nothing, AddressOf users_mousedown) 
    MenuStrip1.Items.Add(tsmi) 

End Sub 

Le gestionnaire pour le menu utilisateur (où SQLite_db est une classe qui ressemble après la base de données et user_class est une classe avec deux articles (nom d'utilisateur et mot de passe) sous forme de chaînes.

Sub users_mousedown() 

    Dim submenu As New ContextMenuStrip 
    Dim database As New SQLite_db 

    Dim user_list As New List(Of user_class) 
    user_list = database.List_Users 

    For Each user As user_class In user_list 
     submenu.Items.Add(user.username, Nothing, AddressOf Open_new_window(user)) 
    Next 

    submenu.Items.Add("Add new user", Nothing, AddressOf AddNew) 
    submenu.Show(Control.MousePosition) 

End Sub 

Ce que je veux arriver est lorsqu'un utilisateur clique sur le menu contextuel d'un nouveau formulaire enfant MDI est créé et les données utilisateur est passé, mais parce que AddressOf n'aime pas qui passe cela ne fonctionne pas ...

J'ai regardé des délégués et des expressions de landa mais je ne pense pas que l'un d'entre eux fasse ce dont j'ai besoin, l'autre option est de créer ma propre sous-classe de la classe ContextMenuStrip, qui 1) gère les clics comme je veux et 2) ressemble à un cauchemar.

Avant de lancer ce que je pense sera un sacré boulot, ai-je oublié quelque chose? est-ce un moyen simple de faire ce que je veux faire? ou sinon va sous-classer ContextMenuStrip travail et si aucune idée de ce qui va (et si elle le veut, des idées sur la façon de commencer à apprendre comment faire cela)

Répondre

2

Un moyen simple d'encapsuler les informations de l'utilisateur est avec une classe Helper, dans laquelle vous stockez les informations de contexte.


Public Class Question1739163 
    Class HelperUserCall 
     Public userId As String 

     Sub New(ByVal id As String) 
      userId = id 
     End Sub 

     Public Sub OnClick() 
      MsgBox(Me.userId) 
     End Sub 
    End Class 
    Private Sub Question1739163_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim t As New ToolStripMenuItem("Users", Nothing, AddressOf user_mousedown) 
     MenuStrip1.Items.Add(t) 
    End Sub 

    Public Sub user_mousedown() 
     Dim s As New ContextMenuStrip 
     Dim a As HelperUserCall 

     a = New HelperUserCall("u1") 
     s.Items.Add(a.userId, Nothing, AddressOf a.OnClick) 

     a = New HelperUserCall("u2") 
     s.Items.Add(a.userId, Nothing, AddressOf a.OnClick) 

     s.Items.Add("New User", Nothing, AddressOf add_new) 
     s.Show(Control.MousePosition) 
    End Sub 

    Sub add_new() 
     MsgBox("add new") 
    End Sub 
End Class 

Vous pouvez améliorer la classe d'aide en ajoutant la référence à la base de données dans le constructeur, et récupérer les informations de l'utilisateur lorsque l'utilisateur clique sur l'option.

+0

aha, merci je vais donner un coup ce soir (heure du Royaume-Uni) –

Questions connexes