Komunikacja między MENU - ( w MDI PARENT) a innym oknem CHILD

0

Witam,
w oknie głównym form 1 mam stworzone menu z przyciskami ( Form1 - IS MDI CONTAINER - TRUE)
klikam na pierwszy przycisk w menu i wyświetla mi się form 2.

Teraz mam problem bo drugi przycisk z menu powinien wywołać określoną funkcję z form 2 ale nie wiem jak się do niej odwołać ( W form 2 mam zdefiniowe:
public void ZapiszDaneTeleadresowe() { tu jest kod} i po naciśnięciu przysiku będącego w form1 w menu chce aby to się wykonało)

0

Muszisz pobrać aktywne okno zrzutować ja na odpowiedni typ/interfejs, wywołać metodę.
W MDI praktykowało się też że aktywne okno modyfikowało menu (są odpowiednie mechanizmy do tego - MergeType w MenuItem) i w tym momencie aktywne okno do menu dodaje/podmienia swoje elementy. A w nich obsługa kliknięcia jest już w form2, więc jesteś w kontekście odpowiedniego okna.

0

Mogę prosić jakiś przykład lub tutorial na taki temat

0

http://msdn.microsoft.com/en-us/library/xyhh2e7e.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.menumerge.aspx
i setki innych przykładów w necie

Generalnie z child do parent to w oknie dziecku masz parenta rzutujesz na twój typ i możesz na nim operować. Chociaż nie widzę potrzeby takiej, poza porąbanymi zadaniami na laborkach :)
Komunikacja z parent do child, masz właściwość ActiveMdiChild, dostajesz aktywne okno i najlepiej ustalić sobie jakiś spójny interfejs/grupę interfejsów/typ bazowy okien mdi i komunikować się przez wymyślone api. np. IDoWork {void DoWork1(); int doWork2(); ...} twoje okna dzieci implementują taki interfejs, a nadrzędne okno wywołuje metody z interfejsu po rzutowaniu na niego.

Teraz mam problem bo drugi przycisk z menu powinien wywołać określoną funkcję z form 2 ale nie wiem jak się do niej odwołać ( W form 2 mam zdefiniowe:
public void ZapiszDaneTeleadresowe() { tu jest kod} i po naciśnięciu przysiku będącego w form1 w menu chce aby to się wykonało)

Rozumiem że przycisk drugi, to opcja w menu.
Przycisk drugi powinien być w menu form2, a nie okna głównego z opcją MenuItem.MergeType=Add i metodą obsługi tego item'a w form2. W tym momencie ZapiszDaneTeleadresowe nie musi być public, bo obsługa kliknięcie itemu menu jest w form2 jak ta metoda.

Może szerzej opisz jak chcesz zbudować program i jak ma wyglądać, bo podejrzewam że może źle zrozumiałeś filozofię MDI i chcesz użyć jej nie do końca z jej zamysłem. Nie znaczy że nie można użyć MDI jako sztuczki, tylko trzeba to zrobić świadomie i pod warunkiem że inaczej łatwiej i sensowniej się tego nie osiągnie.

0

Program posiada okno główne gdzie umieszczony jest pasek typu Ribbon.
Przyciski to np. wiadomości, dane użytkownika, oceny itp. taki eletktroniczy dzienniczek ucznia.

np. po kliknięciu na wiadomości chce aby wyświetlił się panel dotyczący wiadomości itd. tylko gdybym te wszystike rzeczy umieścił w jednej formatce to nic nie było by widać w Design View.

Wymyśliłem więc okna w oknie głównym.

Testuje teraz coś takiego że po naciśnięciu na przycisk:

if (ActiveMdiChild is Form2)
{
From2 activeChild = (Form2)ActiveMdiChild;
activeChild.ZapiszDaneTeleadresowe();
}

i działa pięknie :)

Masz jakąś inną propozycję nadmienię, że jestem początkujący i potrzebuję gotowych przykładów :)

0

uwaga do tego kawałka kodu, który jest poprawny, ale lepiej tak:
Form2 f2 = this.ActiveMdiChild as Form2;
if (f2 != null)
{
f2.ZapiszDaneTeleadresowe();
}
wykonujesz tylko jedno rzutowanie, a nie dwa jak u ciebie

Ribbon z czego dziedziczy? Co to za kontrolka? Wiem generalnie jak ribbon wygląda, tylko nie pamiętam czy w którymś .net (4.0?) dali to jako standardową kontrolkę.
Jeśli ribbon dziedziczy z MainMenu a jego itemy z MenuItem to mechanizmy dla MDI powinny ładnie działać.

Jednak ja poszedłbym w SDI, a na formie głównej wyświetlał odpowiednie UserControl, więc w design mode nie będziesz miał problemu, bo wszystko będzie na osobnych user control, które dynamicznie będą ładowane na formę główną.

0

Ok a jak po zamknięciu okna potomnego child (MojeDane) odwołać się do funkcji w
oknie mdiparent ( OknoGlowne) [ public void Ukryj(){ textbox1.Visible= false;} ]

private void MojeDane_FormClosed(object sender, FormClosedEventArgs e)
{
??????????????????.Ukryj();
}

Co wstawić w miejsce ???????? aby widział te funkcje Ukryj()

?

0

Parent zrzutowany na typ okna głównego.

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