none
Jak vytvořit Form s překrývajícími se mnoha panely

    Dotaz

  • V Delphi jsem to řešil pomocí Frames, ale ve VS2010 to neumím.

    Jde o to že na levé straně hlavního Form1 je TreeView, na pravé straně by mělo být připraveno mnoho panelů, z nichž každý obsahuje jiné komponenty. Zobrazuje se však pouze jeden z panelů. Jde o něco jako TabControl s mnoha tabPages, ale bez těch záložek TabControl, s řízením výběru vhodného panelu (tabPage) programově. Výběr určitého nodu v TreeView pak má způsobit zobrazení určitého panelu (ze zatím předpokládaných asi 20) na pravé straně Form1. Panely pak mají umožňovat editaci dat která jsou různého charakteru, podle vybraného konkrétního nodu, hloubky jeho vnoření a jeho rootu.

    Komponent na všech zobrazitelných panelech je opravdu požehnaně. Neřešil podobnou věc již někdo ? Nebo nemáte nápad jak to řešit ?

    Vladimir

     

    2. září 2010 14:02

Odpovědi

  • Jde to úplně easy.

    1. MainForm bude obsahovat nějaký SplitContainer, kde levý panel obsahuje treeview a pravý panel je prázdný

    2. Vytvoříš UserControl který si nadesignuješ jak chceš.

    3. V případě výběru TreeNode stačí jen smazat Controls z objektu panel2 SplitContaineru a přidat vytvořený UserControl, který bude mít vlastnost Dock nastavenu na Fill.

    Funguje to perfektně, já mám takhle udělaný SW, který si dokonce sám zjistí v adresáři jaké tam jsou DLL knihovny, vytáhne si z nich moduly a závislosti, které nahraje do treeview a tyto už jsou samoobslužné, takže pak zobrazují vlastní panel podle toho, jak který modul v treeview byl vybrán.

    Je třeba řádně pracovat s Interfaces a s Reflections a dá se z toho vymačkat vlastě všechno.

     

    28. září 2010 20:03

Všechny reakce

  • Dobrý den, 

    Tak zkuste to vyřešit tak, jak píšete v nadpisu. Vytvořte 20 různých panelů a pak jen programově je zobrazujte. Zkoušel jsem něco podobného a bez přidávání externích knihoven či addonů si myslím že tohle je nejjednodušší řešení.

    11. září 2010 20:52
  • Dobrý den, děkuji za tip. To jsem zkoušel jako první ale zarazila mě obtížnost editování prvků v jednotlivých panelech a nepřehlednost programu. Nejenom že byl sáhodlouhý Form1.cs - to jsem upravil přemístěním obslužných rutin jednotlivých panelů a příslušných komponent z Form1.cs do souborů panel1part.cs, panel2part.cs a podobných, které všechny mají public partial Class Form1:Form. Zůstává však velmi obtížná editace vzhledu a komponent. Jelikož všechny panely jsou stejně velké a na stejné pozici, tak se při vizuálním návrhu většinou stane, že namísto aby přidávaný panel byl zaregistrován (jak potřebuji) jako komponenta z Form1,  je zaregistrován jako komponenta patřící nějakému již dříve vloženému panelu - což způsobí úplně jiné chování programu a hledání co se vlastně stalo. Form1.Designer si totiž vymýšlí věci jako this.panel1 .Controls.Add(this.panel3 ) které musím bedlivě hlídat a ručně odstraňovat. Pokud je rodičovský panel Hide tak vnořený panel nezobrazím kdybych se rozkrájel.
    V Delphi měla komponenta Frame tu vlastnost, že se jednalo o panel který byl v samostatném souboru a tak se snadno editoval a prohlížel (ve nějakém virtuálním kontejneru).

    Uvažoval jsem také o tvorbě vlastních komponent MyPan1...MyPanx odvozených z Panelu. Ty by se daly editovat samostatně při tvorbě komponenty. Ale to mě připadá jako "kostrbaté" řešení zvláště pro případnou aktualizaci programu. Vytvářet pro každou změnu vzhledu panelu novou komponentu znamená nekompatibilitu starší verze programu s nainstalovanou novější verzí komponenty a zvyšuje možnost omylu.

    No, asi mě nic jiného nezbude než to udělat tak jak píšete a prodělat si anabázi s editováním hromady panelů v jednom formuláři. Bojím se ale že Form1.Designer mě může při nějaké změně v panelu zlikvidovat celý program. Vladimír
    13. září 2010 16:33
  • Jde to úplně easy.

    1. MainForm bude obsahovat nějaký SplitContainer, kde levý panel obsahuje treeview a pravý panel je prázdný

    2. Vytvoříš UserControl který si nadesignuješ jak chceš.

    3. V případě výběru TreeNode stačí jen smazat Controls z objektu panel2 SplitContaineru a přidat vytvořený UserControl, který bude mít vlastnost Dock nastavenu na Fill.

    Funguje to perfektně, já mám takhle udělaný SW, který si dokonce sám zjistí v adresáři jaké tam jsou DLL knihovny, vytáhne si z nich moduly a závislosti, které nahraje do treeview a tyto už jsou samoobslužné, takže pak zobrazují vlastní panel podle toho, jak který modul v treeview byl vybrán.

    Je třeba řádně pracovat s Interfaces a s Reflections a dá se z toho vymačkat vlastě všechno.

     

    28. září 2010 20:03