Динамическое меню на основе базы данных в VB.Net
Я пытаюсь создать приложение 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 ответ
Простой способ инкапсулировать информацию о пользователях с помощью вспомогательного класса, где вы храните контекстную информацию.
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
Вы можете улучшить вспомогательный класс, добавив ссылку на базу данных в конструкторе и получая информацию о пользователе, когда пользователь нажимает на эту опцию.