динамическое меню на основе базы данных в VB.Net - PullRequest
0 голосов
/ 16 ноября 2009

Я пытаюсь создать приложение VB.Net, управляемое базой данных, которое извлекает список зарегистрированных учетных записей из базы данных и отображает имена пользователей учетных записей в меню, чтобы пользователь мог выбрать одну и открыть новую форму (где они работать с ним).

у меня есть конструктор для родительского окна MDI

Public Sub New()

    InitializeComponent()

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

End Sub

Обработчик пользовательского меню (где SQLite_db - это класс, который следит за базой данных, а user_class - это класс с двумя элементами (имя пользователя и пароль) в виде строк.

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

То, что я хочу сделать, это когда пользователь нажимает на контекстное меню, создается новая дочерняя форма MDI, и данные в пользователя передаются, однако, поскольку AddressOf не любит передачу данных, это не работает ...

Я смотрел на делегаты и выражения ленд, но не думаю, что кто-либо из них делает то, что мне нужно, другой вариант - сделать мой собственный подкласс класса ContextMenuStrip, который 1) обрабатывает щелчки так, как я хочу и 2) звучит как кошмар.

Прежде чем я приступлю к тому, что, по моему мнению, будет адской работой, я что-то упустил? это простой способ сделать то, что я хочу сделать? или, если нет, будет работать подклассификация ContextMenuStrip, и если нет каких-либо идей относительно того, что будет (и если будет, какие-либо идеи относительно того, как начать изучать, как это сделать)

1 Ответ

2 голосов
/ 16 ноября 2009

Простой способ инкапсулировать информацию о пользователях с помощью вспомогательного класса, где вы храните контекстную информацию.


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

Вы можете улучшить вспомогательный класс, добавив ссылку на базу данных в конструкторе и получая информацию о пользователе, когда пользователь нажимает на эту опцию.

...