Tworzenie menu Visual C#


(Jarek P) #1

Mam problem.

Potrzebne mi menu do mojej aplikacji. Wiem, że mógłbym to zrobić za pomocą paneli, ale to dosyć słabe rozwiązanie. Słyszałem o możliwości użycia UserControl.

Moje pytanie brzmi: Jak mam to zrobić? :slight_smile:


(M@ster) #2

Chodzi Ci o menu główne (te na górze), czy menu kontekstowe dla jakiegoś elementu na formie?


(Jarek P) #3

To na górze już mam. Chodzi mi o taki button, po kliknięciu którego wyświetli się zawartość UserControl'a, w danym miejscu. Takie nieruchome menu po lewej stronie i zmiana zawartości zawsze w tym samym miejscu.


(Fiołek) #4

Przy zdarzeniu kliknięcia usuwaj wszystkie kontrolki w tym "panelu po lewo" i na ich miejsce dodaj nową UC.


(Jarek P) #5

Ok. Ale jak to zrobić w praktyce ?


(Tomek Matz) #6

W Windows Forms masz dwie gotowe kontrolki, które służą do tworzenia Menu. Jedna się nazywa MenuStrip (tekstowe menu), a druga ToolStrip (obrazkowe menu) i to z nich powinieneś korzystać.

Ale skoro się uparłeś, żeby użyć tego UserControl to w zdarzeniu Click tego przycisku, który umieścisz na formie dodaj taki kod

control = new ();

this..Controls.Add(control);

this..Controls.SetChildIndex(control, 0);

Powyższy kod spowoduje, że po naciśnięciu przycisku na pozycji 0,0 (czyli w lewym górnym rogu) kontenera (np. panela, formy, tabcontrol, itp.) wyświetlony zostanie Twój UserControl. Przysłoni ona wszystkie kontrolki, które już się tam znajdują. Możesz pomyśleć nad dodaniem jakiejś animacji, gdy ta kontrolka się pojawia (ja tego nigdy nie robiłem, więc tu nie pomogę, musiałbym pogooglować).

Oczywiście jak będziesz chciał zmienić miejsce, w którym ten UserControl na danym kontenerze ma się pojawić to nie ma z tym problemów. Musisz po prostu sprecyzować właściwość Location (spójrz najlepiej w pliku Designer.cs dowolnej formy jak jest to robione dla poszczególnych kontrolek).


(Jarek P) #7

A propos tego toolstrip... Ja myślałem o UC,ale się przy tym nie upieram. Po prostu potrzebuje dobrego rozwiązania. Tak więc co dałoby mi zastosowanie Toolstripa ?


(Tomek Matz) #8

Najprościej będzie jeśli wrzucisz sobie na formę ten ToolStrip i zobaczysz co przy jego użyciu możesz zrobić. Dla przykładu spójrz na menu w Visual Studio. Pierwsza jego sekcja zawierająca File, Edit, View itd. może zostać zrobiona właśnie przy użyciu MenuStrip, a druga jego sekcja zawierająca te wszystkie obrazkowe buttony, jakieś dropdowny, itp to jest właśnie ToolStrip.


(Jarek P) #9

No spoko popróbuje :smiley: Dzięki wam serdeczne :slight_smile: Ale co z tym wyświetlaniem zawartości ?


(Tomek Matz) #10

Nie rozumiem. Jakiej zawartości? Doprecyzuj pytanie.


(Jarek P) #11

Chodzi mi o taki jakby panel główny, na którym wyświetlane będą różne rzeczy - w zależności od tego, co klniemy w menu. Np klikniemy Mercedes, to wyświetli nam tam Meśki, BMW, to BMW itd.


(Tomek Matz) #12

Hm, no ja Ci nie rozplanuje jak ma wyglądać główne okno Twojego programu. To co napisałeś o tych markach i modelach to pierwsze co mi przychodzi do głowy to umieścić gdzieś na formie 2x ComboBox. Jeden będzie wyświetlał listę marek, a drugi po wybraniu odpowiedniej marki listę modeli. Marki i modele powinny być ładowane z bazy danych. Ale wiesz to wszystko zależy od tego co chcesz mieć na formie. Pokombinuj na razie sam, popatrz na te kontrolki, które udostępnia Visual Studio i ewentualnie wtedy zadaj dokładniejsze pytanie.


(Jarek P) #13

:slight_smile: Nie robię programu o modelach. Chodzi mi tylko o sposób na wyświetlenie czegoś. Już po kliknięciu. Mam bardzo dużo kontrolek i chcę je rozplanować, ale żeby nie było wszystko na kupie, tylko grupami. I po kliknięciu ma wyskoczyć dana grupa 8)


(Tomek Matz) #14

OK, teraz rozumiem. Możliwości jest wiele. Możesz np. zrobić tak jak wykonane jest to na tym zrzucie ekranu http://www.bfmsa.com.pl/screen/BitComet.jpg.

Czyli po lewej stronie okna umieszczasz sobie kontrolkę TreeView (jak to jest na obrazku) lub prostszą kontrolkę ListBox. Po wybraniu odpowiedniej opcji z tego TreeView lub ListBox, po prawej stronie okna wyświetli się inna grupa kontrolek. Te kontrolki po prawej stronie okna pogrupuj w zagnieżdżonych kontrolach SpliContainer (zobacz jak się ją obsługuje). Kontrolka ta ma dwie istotne właściwości:

Panel1Collapsed

Panel2Collapsed

Przykładowo w jednym panelu tej kontrolki SplitContainer umieścisz jedną grupę kontrolek, a w drugim panelu tej kontrolki SplitContainer drugą grupę kontrolek. Jeśli będziesz chciał, żeby widoczne były tylko kontrolki z panelu pierwszego to ustawiasz Panel2Collapsed na true (czyli użytkownik wybrał odpowiednią opcję z Listbox, to Ty ustawiasz Panel2Collapsed na true). Jeśli będziesz chciał, żeby widoczne były kontrolki z panelu drugiego ustawiasz Panel1Collapsed na true.

Możesz też np. umieścić sobie ToolStrip jako menu. Wówczas po kliknięciu wybranego buttona z tego ToolStripa wyświetlać się będzie inna grupa kontrolek. Również przy użyciu tego SplitContainera.

Jakbyś chciał np. użyć tych UserControl to nie ma problemu. Możesz np. sobie zrobić kilka takich kontrolek, które będą grupować różne kontrolki i wówczas w poszczególnych panelach tego SplitContainera umieścić poszczególne UserControlki.

PS Przepraszam z góry za ten mix j. polskiego i angielskiego :confused:


(Jarek P) #15

Na szczęście z angielskim nie mam problemów :slight_smile: Dzięki za odpowiedź. Myślę, że o to mi chodziło. Ale mam jeszcze jeden problem... Potrzebuje stringa podzielić na chary... I dać do jakiejś listy. To ok, ale jak go podzielić ? Chcę zrobić coś na zasadzie koder-dekoder do tego programu...


(Tomek Matz) #16

string to nic innego jak tablica charów, dlatego możesz np. wykonać taką pętlę:

foreach(char c in jakisstring)

{}

Możesz np. użyć tej metody ToCharArray


(Jarek P) #17

Dzięki to pomocne. A to od razu o coś jeszcze zapytam... :slight_smile:

Dlaczego ten kod nie działa ? Wywala errora...

UserControl1 us = new UserControl1();



            splitContainer1.Container.Add(us);

I jak ten problem naprawić ? Może idę nie w tą stronę?


(Tomek Matz) #18

Przydałby się komunikat błędu następnym razem. Spróbuj tak:

UserControl1 us = new UserControl1();

splitContainer1.Panel1.Controls.Add(us);

lub

splitContainer1.Panel2.Controls.Add(us);

w zależności od tego, do którego panela dodajesz. Jeszcze jedno właściwość Orientation ustaw na Horizontal dla tego SplitContainera.


(Jarek P) #19

Dzięki działa :smiley: Pomogłeś mi dzisiaj tak dużo, że gdybym Cię znał, to postawiłbym Ci piwo :slight_smile:


(Tomek Matz) #20

Zwykłe dzięki w zupełności wystarcza. Nie ma za co.