Dodawanie menuitem z bazy danych

0

Mam następujący problem - chciałbym budować menu dynamicznie na podstawie struktury przechowywanej w bazie danych.

Mam metodę którą chcę dodawać nowe pozycje menu:

private void DodajElementyPodmenu(MenuItem menuNadrzedne, string NazwaMenu, string Naglowek, RoutedEventHandler click)
        {
            MenuItem mn = new MenuItem();
            mn.Name = NazwaMenu;
            mn.Visibility = Visibility.Visible;
            mn.Header = Naglowek;
            mn.Click += click;
            
            menuNadrzedne.Items.Add(mn);
        }

Problem leży w pierwszym parametrze przekazywanym do metody - w bazie danych "menuNadrzedne" jest wartością VARCHAR która jest odczytywana i traktowana jako string. Jak ją zamienić lub jak przebudować moją metodę żebym mógł z bazy podać nazwę menu nadrzędnego do którego ma być dodany menuitem?

0

varchar to string więc prześlij do metody stringa, a nie obiekt

0

Wiem że varchar to string. Pytanie jak przekazać do metody info że ten string jest nazwą obiektu bez tworzenia nowego obiektu? Ten obiekt już istnieje w aplikacji, ja tylko chcę go wskazać odczytując strukturę menu z bazy i dodać podpozycje menu do istniejących już obiektów menu głównego

0

Moim zdaniem musisz mieć funkcję przeszukującą strukturę Menu dla pobranej nazwy z bazy. Funkcja zwraca jako wynik element menu. Jego przekazujesz jako parametr.
Przykład ale z wykorzystaniem ToolStripMenuItem

ToolStripMenuItem ZnajdzPozycje(ToolStripMenuItem aoMenuItem, string asNazwa)
		{
			foreach (ToolStripMenuItem tmpMenuItem in  aoMenuItem.DropDownItems)
			{
				if (tmpMenuItem.Text == asNazwa)
				{
					return tmpMenuItem; 
				}
				else return ZnajdzPozycje (tmpMenuItem, asNazwa);					
			}
			return null; 
		}
0

Prawdopodobnie w bazie przechowujesz teksty menu itemów, np: "Otwórz", "Zamknij" itd. Jeśli tak, to jest to źle wykonane i na pewno w pewnym momencie szlag trafi cały Twój system. Dlaczego? A co jeśli będziesz miał 2 elementy menu z takim samym tekstem? To wcale nie jest nic dziwnego.

Powinieneś to zrobić w inny sposób:

  • przechowuj nazwy menu itemów - np: OpenMenuItem, a potem wyszukaj na formie menu item po tej nazwie. To oczywiście też jest kiepskie rozwiązanie, bo co się stanie jeśli w pewnym momencie zmienisz nazwę menu itema z jakiegoś powodu? To się raczej nie zdarza w istniejącym systemie, ale może się zdarzyć.

  • przechowuj w bazie tylko ID menu itemów. Możesz je mapować w aplikacji we właściwości TAG.

W Twoim przypadku, to po prostu musisz przeszukać menu itemy szukając tego z odpowiednim stringiem.
Daj znać, co chcesz osiągnąć.

0

marek.kotowski - dzięki za pomysł z przeszukiwaniem, sprawdzę zaraz ten mechanizm.

Juhas - co do Twojego pytania co chcę osiągnąć to ma to wyglądać mniej więcej tak:

  • aplikacja jest w WPF, jest główne okno aplikacji w której jest to menu o które mi chodzi
  • każda opcja menu otwiera jakieś User Control, nazwy są unikatowe
  • każda opcja menu ma również swoje unikatowe ID
  • na podstawie tego menu buduję schemat uprawnień - biorę ID menu i jego nazwę jako nazwę modułu, operator dostaje lub też nie uprawnienia do tego modułu
  • wczytuję przy starcie aplikacji z bazy danych do datatable tylko te opcje do których operator logujący się ma prawa i na tej podstawie buduję menu

Generalnie dotychczas głównie tworzyłem aplikacje WinForms - to mój pierwszy większy projekt z WPF i chciałbym od początku go dobrze zaprojektować bo ma być on ostatecznie dość rozbudowany. Może jest inne rozwiązanie na menu w WPF? Może można strukturę menu przechowywać w słownikach i bindować? Nie znalazłem prostego przykładu który by rozwiązywał tą kwestię.

0

Jeśli to Twój pierwszy projekt w WPF i ma być to większy system, to jest to Twój największy problem :) Nie zrobisz dobrze dużego systemu pisząc pierwszy raz w jakiejś technologii. Jeśli chcesz się nauczyć WPF, zacznij od małych rzeczy. Tutaj będziesz w większości "macał się" z WPF i patrzył, co się stanie. Przy kolejnym projekcie będzie już lepiej. Przy następnym dużo lepiej. Więc jeśli musisz to napisać, to radzę zostać w WinForms i ćwiczyć WPF na mniejszych rzeczach.

Co do menu. A może zrobić to inaczej? Niech menu będzie stałe - zrobione statycznie. Dopiero podczas odczytu uprawnień sprawdzasz, czy użytkownik ma mieć dostęp do danego modułu. Jeśli nie, to ukrywasz/usuwasz dany menu item. To wydaje mi się dużo prostszym rozwiązaniem i nie robi bałaganu w bazie.

0

Wiem że jeszcze wiele muszę się nauczyć. Tyle że jak teraz zacznę pisać w WinForms to później będę i tak musiał zacząć to samo od zera w WPF a pisząc w WinForms braknie mi czasu na naukę WPF i tak muszę uczyć się w trakcie tworzenia poprzez "praktykę" :) Generalnie projekt ma być większym tworem ale powstaje "modułowo" czyli na początek 2-3 moduły, później kolejne itd. Jak widzisz aktualnie jestem na jego początku i chcę od podstaw jakoś mądrze ogarnąć schemat menu powiązanego z uprawnieniami. Na razie to menu będzie miało 2-3 pozycje ale z czasem będzie ich więcej stąd pomysł trzymania wszystkiego w bazie z której później i tak będę odczytywał nazwy modułów do ustawiania uprawnień.

Zrobię tak jak sugerujesz, menu będzie statyczne w programie, będę przeszukiwał czy dany item jest w uprawnieniach danej osoby i jak nie będzie to wtedy zrobię Visibility=Visibility.Hidden.

1 użytkowników online, w tym zalogowanych: 0, gości: 1