[C#] Wyszukanie konkretnej formy (mdiChildern)

Mam Formę główną i kilka form potomnych (mdi). Jak wyszukać z wielu wcześniej utworzonych okien jedno konkretne.

Wiem że istnieje funkcja this.mdichildren, ale ta zwraca tablice, a ja potrzebuje jednego konkretnego okna np. Form3, aby wywołać w nim funkcje.

Nie widzę problemu. Zadbaj o to, aby każde tworzone okno potomne miało jakąś sensowną nazwę (nazwa ta oczywiście będzie unikalna dla każdego z tych okien). Następnie, gdy będziesz potrzebował wywołać metodę, na którymś z okien potomnych to robisz tak jak powiedziałeś, czyli korzystasz z właściwości MdiChildren. Przechodzisz pętlą po otrzymanej tablicy okien potomnych i wybierasz jedno z nich o jakiejś konkretnej nazwie, np. Form3.

Możesz też pomyśleć nad tym, żeby wszystkie tworzone okna potomne wrzucać do jakiejś hashtablicy. Wówczas nie będziesz musiał za każdym razem wykonywać pętli, żeby znaleźć konkretne okno potomne. Kluczami w tej hashtablicy będą unikalne nazwy okien, a wartościami oczywiście same okna (a w zasadzie referencje do tych okien).

Jeśli metodę będziesz musiał wywołać na aktualnie aktywnym oknie potomnym to możesz skorzystać z właściwości ActiveMdiChild zamiast MdiChildren. Ta właściwość zwraca tylko i wyłącznie aktualnie aktywne okno potomne.

Zrobiłem jak mówisz

void miWykonaj_Click(object sender, EventArgs e)

        {

            if (gv.bForm3_OnOff == false)

            {

            }

            else

            {

                Form[] f = this.MdiChildren;

                int i;

                string s = "Zapytanie Sql";

                for (i = 0; i < f.Length; i++)

                {

                    if (f[i].Text == s)

                    {

                        break;

                    }

                }

                Console.WriteLine(f[i].Text); // I tutaj wychodzi mi że złapał dobrą kontrolkę


                string s2;

                s2 = f[i].ZwróćZdanieSql(); // i tu chce wywołać funkcje i wyskakuje BŁĄD, funkcja ma zwracać z innej formy richbox.text


                Console.WriteLine(s2);

            }

        }

dla pewności funkcja wygląda tak

public string ZwróćZdanieSql()

        {

            return rbZapytanieSql.Text;

        }

co radzicie zrobić, czemu ta funkcja nie chce się wywołać, kompilator zwraca błąd

wydaje mi się, że brakuje rzutowania … byłbym pewien, gdybyś wkleił mi komunikat błędu :stuck_out_tongue: anyway zrób coś takiego:

s2 = (()f[i]).ZwróćZdanieSql();

i mówię pomyśl nad zastosowaniem tej hashtablicy. Nie jest to konieczne, ale kod będzie bardziej elegancki i odrobinę bardziej wydajny.

s2 = ((Form3)f[i]).ZwróćZdanieSql();

Zrobiłem tak i faktycznie działa. Wielkie dzięki za pomoc Matzu.