Problem z aplikacją okienkową

0

Witam.

Podczas pisania prostej aplikacji okienkowej (na dwóch klasach typu Windows Form) natrafiłem na (pewnie trywialny) problem. Otóż nie wiem jakie polecenie mam wpisać w miejsce ?????? aby w treeView1 pojawił się węzeł o nazwie "Node_added_by_Form2". Kod obu klas:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        treeView1.Nodes.Add("Node_added_by_Form1");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2();            
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    
    private void button3_Click(object sender, EventArgs e)
    {
        <span style="color: red"><b>??????</b></span>
    }
}

Ja ten problem rozwiązałem następująco:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        treeView1.Nodes.Add("Node_added_by_Form1");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        <b><span style="color: red">//Form2 frm = new Form2();
        Form2 frm = new Form2(ref treeView1)</span>;</b>
    }


}

public partial class Form2 : Form
{
    <b><span style="color: red">TreeView treeCopy1 = new TreeView();</span></b>

    public Form2()
    {
        InitializeComponent();
    }
    
    <b><span style="color: red">public Form2(ref TreeView treeCopy2)
    {
        InitializeComponent();
        treeCopy1 = treeCopy2;
    }</span></b>

    private void button3_Click(object sender, EventArgs e)
    {
        <b><span style="color: red">treeCopy1.Nodes.Add("Node_added_by_Form2");</span></b>
    }
}

Obawiam się jednak, że nie jest to rozwiązanie optymalne. Proszę Was o wyrażenie Waszej opini na ten temat oraz o ewentualną propozycję bardziej optymalnego sposobu.

Pozdrawiam.

Rafał (bakłażan)

0

Nic dużo lepszego nie wymyślisz. Z tym, że i tak występuje pewien błąd. W Form2 nie potrzebnie tworzysz nową instancję TreeView. Pamiętaj, że klasy w C# same z siebie są przekazywane przez referencję, więc w Form2 nie trzeba tworzyć od nowa całego TreeView. Czyli:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            treeView1.Nodes.Add("Node_added_by_Form1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Form2 frm = new Form2();
            Form2 frm = new Form2(treeView1);
        }


    }

    public partial class Form2 : Form
    {
        TreeView treeCopy1;

        public Form2()
        {
            InitializeComponent();
        }
       
        public Form2(TreeView treeCopy2)
        {
            InitializeComponent();
            treeCopy1 = treeCopy2;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            treeCopy1.Nodes.Add("Node_added_by_Form2");
        }
    }
0

Dziękuję za pomoc! :)

Mam jeszcze jedno pytanie, mianowicie czy jest możliwość aby po wyświetleniu formy 'Form2' zadeklarowanej jako:

 Form2 frm = new Form2();

za pomocą funkcji:

 frm.Show();

aplikacja nie pojawiała się w pasku zadań?

Pozdrawiam.

Rafał (bakłażan)

0

Już wiem, nie było to zbyt skomplikowane..! :)

frm.ShowInTaskbar = false;

Dziękuję raz jeszcze za pomoc!

Pozdrawiam.

Rafał (bakłażan)

0

Mam kolejne pytanie:

Czy po wyświetleniu formy 'Form2' możliwe jest zablokowanie formy 'Form1', a następnie po zamknięciu formy 'Form2' odblokowanie formy 'Form1'?

Domyślam się, iż muszę dopisać następujący kod do zdarzenia otwierającego formę Form2:

    private void button2_Click(object sender, EventArgs e)
    {
        //Form2 frm = new Form2();
        Form2 frm = new Form2(treeView1);
        <b><span style="color: red">this.Enabled = false;</span></b>
        frm.ShowInTaskbar = false;
        frm.Show();
    }

Jakie zdarzenie opisuje zamkniecie formy 'Form2', ewentualnie jakie zdarzenie będzie opisywało powrót do formy 'Form1'? Wiedząc to mógłbym chyba stworzyć delegata do takiego zdarzenia i w nim dopisać:

    this.Enabled = true;

Próbowałem stworzyć delegata do zdarzenia:

    this.Activated += new System.EventHandler(this.clsMainClass_Activated);

Po powrocie do formy ‘Form1’ forma ta się minimalizuje, więc nie wiem czy używam właściwego zdarzenia..

Proszę o pomoc.

Pozdrawiam.

Rafał (bakłażan)

0

Blokade otrzymasz korzystajac z ShowDialog(), zamiast Show()...

0

Zgadza się! ;) O to chodziło! ;)

Dziękuję za pomoc! :)

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