Zapozdření dialogů   zodpovězená otázka

Komponenty, Architektura, .NET

Dobrý den. Měl bych jeden obecný dotaz, týkající se zapouzdření dialogu ve třídě. Jde o to, že bych si rád vytvořil sadu komponent odvozených od TextBoxu, ve kterých bych na RightClick myši otevíral dialogová okna (formuláře). Každý textbox by volal specifický dialogový panel.

Rád bych výše uvedené řešení použil ve Winforms projektu, kde bych na pravý klik myší otevíral určité číselníky (seznamy), ve kterých bych vybral konkrétní hodnotu a po potvrzení zobrazeného dialogu by se tato přenesla zpět do textového pole, ze kterého byl dialog volán.

Napadá mne možnost, kdy bych jednotlivé dialogy umístil do třídy komponent, kde by byly dostupné při volání metody RightClick textového pole.

Co když ale budu chtít výše uvedené dialogy volat i z hlavního menu programu? Pak by tyto dialogy musely být uloženy i v projektu hlavní aplikace.

Tzn. stejné dialogy bych měl uloženy na dvou různých místech (ve dvou různých projektech - v projektu vlastní aplikace a v projektu třídy obsahující komponenty.)

Chtěl jsem se zeptat, zda neexistuje nějaké elegantní řešení, které by umožnilo spravovat dialogová okna pouze na jednom místě (tak aby je bylo možné volat z komponent i z hlavní aplikace) a zároveň by nebylo porušeno pravidlo zapozdření OOP?

Děkuji moc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tento nápad je naprostá příšernost. Proč nepoužijete k tomuto účelu ComboBox, případně obyčejný TextBox s automatickým doplňováním?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Typickým příkladem by mohlo být pořizování faktur.

Uživatel v první řadě vybere firmu, které bude něco fakturovat.

V textovém poli by mohl zadat přímo název firmy (nebo její kód), ale pokud si přesně kód nepamatuje, stiskne pravé tlačítko myši a zobrazí se mu dialog s datagridem, kde má přehledně zobrazen seznam navedených firem včetně adresy atd. Navíc by na tomto dialogu mohly být tlačítka pro přidávání nového záznamu (firmy), její editaci a vymazání.

V gridu by pak klikl na konkrétní řádek (firmu) a po potvrzení by se její kód nebo název přenesl zpět do formuláře pro pořizování faktur, kde by pokračoval dále ve vyplňování ostatních údajů.

Mnoho ekonomických softwarů je řešeno podobným způsobem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No tak ale rozhodně ne na klepnutí pravým tlačítkem, kde je tato funkčnost vyhrazena pro kontextovou nabídku, kterou také uživatel očekává. Toto se běžně řeší malým tlačítkem umístěným na konci textového pole.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ano, máte pravdu. Většinou je to řešeno malým tlačítkem vedle textového pole. Uznávám, že ten rightclick nebyl zrovna moc vhodný příklad.

Nicméně, myslíte, že byste mne mohl nasměrovat, jak vyřešit problematiku zobrazování uvedených dialogových oken, které se budou otevírat právě při kliknutí na ono tlačítko?

Jde mi o to, že bych rád vytvořil komponentu, která by byla složená z textového pole a malého tlačítka. Při kliknutí na toto tlačítko by se zobrazil příslušný dialog. Jenže pokud mám dialog vytvořený v projektu aplikace, nemohu k němu přistupovat ze třídy popsané komponenty, protože ta je fyzicky uložena v samostatném projektu.

Budu vděčný za jakoukoliv radu.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dělat vlastní komponentu kvůli jednomu textovému poli a tlačítku je zcela zbytečné. Vytváření vlastní komponenty se vyplatí v případě ovládacího prvku složeného z více ovládacích prvků, které mohou mít třeba validací vstupních hodnot, nebo vlastního ovládacího prvku.

Pokud máte nějakou komponentu v jiném projektu, není problém tuto komponentu referencovat kdekoliv jinde (pokud má viditelnost Public), toto jsou ale naprosté základy které byste měl vědět.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ano, souhlasím s Vámi.

Nevím, zda jsem se správně vyjádřil.

Pokusím se to uvést na modelovém příkladu.

Řekněme, že je třeba naprogramovat aplikaci, která mimo jiného musí umožnit na různým místech výběr obchodního partnera.

Výběr bude probíhat dvěma možnými způsoby:

1) Přímým vstupem z klávesnice - zadáním jména obch. partnera. Pak je samozřejmě nutné provést validaci správnosti zadání (zadané jméno obchodního partnera musí existovat v seznamu (např. v datové tabulce).

2) Výběrem ze seznamu již evidovaných obch. partnerů. Tento výběr bude možný po kliknutí na tlačítko na konci textového pole. Po kliknutí se zobrazí dialog, ve kterém bude položkový seznam obchodních partnerů. Výběrem a potvrzením se tento obchodní partner (respektive jeho jméno) přenese do textového pole.

Z výše uvedeného vyplývá, že jako ideální se jeví vytvořit třídu nebo komponentu, která v sobě bude zapouzdřovat veškerou funkčnost (tzn. validaci zadaného jména, zobrazení dialogu se seznamem navedených obch. partnerů umožňující výběr).

Nyní přistoupíme k vytvoření samotného dialogu se seznamem partnerů. Nyní ale nastává zásadní problém, kam tento dialog uložit? Má být součástí komponenty a má v ní tedy být zapouzdřen? Nebo se má jednat o dialog, který bude uložen jako jeden z mnoha formulářů hlavní aplikace v projektu aplikace?

Dialog by totiž mělo být možné volat i samostatně např. z hlavního menu aplikace.

Pokud by totiž tento dialog byl součástí projektu aplikace, jak k němu přistupovat zevnitř třídy (komponenty)?

Má se komponentě předávat pomocí nějaké vlastnosti vlastnosti?

Nebo musí být skutečně fyzicky uložen v projektu aplikace i uvnitř komponenty?

Jak se tato problematika v praxi řeší?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Celá aplikace je jeden projekt nebo více projektů v jedné solution? Pokud je to jeden projekt, tak není co řešit. Pokud je to více projektů, tak dialog dejte jako public třídu do projektu, který budou všechny referencovat.

Komponenta klidně může být v projektu s aplikací, doporučuji dát je do nějaké složky uvnitř projektu. Pokud hrozí, že je budete časem používat i jinde, vyčleňte je do samostatné knihovny.

Podívejte se např. jak funguje MessageBox. Dialogové okno udělejte jako klasický formulář a uvnitř nadeklarujte statickou metodu Show, která vytvoří instanci formuláře, zobrazí ji, počká na výsledek a ten vrátí.

Komponenta se pak řeší např. přes Add / New Item / User Control. Přidáte jí vlastnost např. SelectedSupplier, která vrátí vybraného zákazníka, dodavatele či co vlastně vybíráte. Dovnitř této komponenty dáte TextBox, tlačítko pro zobrazení dialogu a validaci.

Udělejte si v projektu třeba složku Controls, kam budete dávat komponenty, a pak Dialogs, kam budete dávat dialogy, ať v tom nemáte zmatek.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Mnohokrát Vám děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback