Jak za pomocą głównej formy uruchomic inną formę ?

0

Mam główne okno, po naciśnięciu buttona chce otworzyć nowe okno a ilość takich samych okien w sumie bez ograniczenia. (więc mogę je otwierać przykładowo z 20 razy) okna będą się różnić jedynie swoją nazwą na pasku informacyjnym. Próba otwarcia okna o nazwie już istniejącej powoduje uaktywnienie tego okna. (wiec deaktywuje okno z główne).
Dodatkowo chciałbym aby zamykając główne okno to chcę aby wszystkie utworzone okna się też pozamykały.
Natomiast okna uruchamiane za pomocą głównego okna, mogę swobodnie zamykać ale główne okno musi jakoś to rozpoznać i odpowiednio zareagować.
Żadne otwierane okno nie może blokować okna głównego.

Może mi ktoś pomóc ?

0

Najprościej będzie jeśli w głównym oknie dodasz pole przechowujące kolekcję typu Form. Każde nowe okno które otworzysz dodaj do tej kolekcji- wtedy będziesz mógł sprawdzić czy kolekcja już posiada daną instancję i jeśli tak- wywołaj Show(). Tutaj przykładowy kod napisany "na kolanie" także można to zrobić zgrabniej. Ale będziesz przynajmniej wiedział o co chodzi:

        List<Form> activeForms = new List<Form>();

        private void button1_Click(object sender, EventArgs e)
        {
            Form form = openedForms.FirstOrDefault(x => x is SecondForm);
            form = form ?? new SecondForm();

            form.Show();
            form.Select();

            if (!activeForms .Any(x => x is SecondForm))
                activeForms .Add(form);
        } 

Program wyłączysz wywołując

 
Application.Exit();
0

Podkreśla mi openedForms i SecondForm - sorry nie za bardzo rozumiem ten kod :-(
Gdzie tutaj podaję nzwe formy, która chce otworzyć ? i jak do niej przekazac kilka danych ?

musiałbym uruchamiać okna z przekazaniem 3 danych. 1x int i 2x String.

rozumiem tez, ze forme którą chcę uruchamiać kompiluje sobie wcześniej i gdy ją wywoluje musze podac 3 zmienne wejściowe.

0

Coś takiego powinno zadziałać.

class OtherForm
{
    public string Name { get; private set; ]

    public OtherForm(string name, int x, int y)
    {
        this.Name = name;
    }
}

class MainForm
{

// ...

    private IList<OtherForm> otherForms = new List<OtherForm>();
 
    private void button1_Click(object sender, EventArgs e)
    {
        var formName = this.txtFormName.Text;

        var form = this.otherForms.FirstOrDefault(q => q.Name == formName);
        if (form != null)
        {
            form = new OtherForm(formName, 666, 997);
            this.otherForms.Add(form);
            form.Show();
        }
        else
        {
            form.Select();
        }
    } 
}

A skąd bierzesz nazwy swoich formatek w rzeczywistości, to chyba Ty powinieneś wiedzieć.

Z drugiej strony, skoro nie domyślasz się, czym są SecondForm i openedForms, to może pora przeczytać jakiś kurs/książkę i zacząć od aplikacji konsolowych?

0

Wybacz zmęczony byłem jak tamto pisałem i pomieszałem dwie nazwy dla jednego pola. Powinno być albo openedForms albo activeForms wszędzie.

Gdzie tutaj podaję nzwe formy, która chce otworzyć ? i jak do niej przekazac kilka danych ?

W tym przypadku tą nazwą innej formy jest SecondForm, a to gdzie ją "podać" i jak przekazać kilka danych to zagadnienia związane z programowaniem obiektowym. Jeśli tego nie znasz to najpierw o tym się poucz na prostych przykładach a później wróc do napisania Twojego programu.

0

Utwórz sobie klasę dziedziczącą po "Form" i do konstruktora dodaj argumenty, które chcesz przekazać do formatki :

 
    class MyForm : Form
    {
        int myInt;
        string myFirstString;
        string mySecondString;

        public MyForm(int _myInt, string _myFirstString, string _mySecondString)
        {
            myInt = _myInt;
            myFirstString = _myFirstString;
            mySecondString = _mySecondString;
        }
    }

a w kodzie tworzysz sobie listę obiektów Twojej klasy, a do każdej utworzonej formatki odwołujesz się nie po jej nazwie, ale po indeksie listy.

tworzenie listy :

        List<MyForm> myFormsList = new List<MyForm>();
 

tworzenie kolejnej formatki:

 
            myFormsList.Add(new MyForm(1, "", ""));
            myFormsList[myFormsList.Count - 1].Text = "xyz"; // tekst na belce formatki
            myFormsList[myFormsList.Count - 1].Show();

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