NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Verquido
Tvůrce
Avatar
Verquido:12.12.2015 15:08

zdravím chtěl bych se zeptat jak na to. Mám jeden form kde mám textbox, listBox a button to samé i v druhém formu. A chci abych mohl v prvním Formu napsat do textboxu jméno a tlačítkem bych to odeslal do Formu2 kde by se to jméno třeba přidalo do listboxu a naopak. Jak na to? :)

 
Odpovědět
12.12.2015 15:08
Avatar
Antonín Tonini:12.12.2015 17:58

Nastav si modifikátory těch objektů na public, ve třídě prvního formu si vytvoř instanci druhého, otevři ho a poté můžeš přistupovat k těm objektům z prvního formu. Pokud chceš z druhého formu přistupovat k objektům prvního, tak musíš předat instanci prvního formu tomu druhému.
Zhruba nějak takto:
Form1

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

        private void button1_Click(object sender, EventArgs e)
        {

            if (form2 != null && form2.IsFormOpened())
                form2.listBox1.Items.Add(textBox1.Text);
            else
            {
                form2 = new Form2(this);
                form2.Show();
                form2.listBox1.Items.Add(textBox1.Text);
            }
        }
    }

Form2

public partial class Form2 : Form
 {
     private Form1 form1;
     public Form2(Form1 form)
     {
         InitializeComponent();
         this.form1 = form;
     }

     private void button1_Click(object sender, EventArgs e)
     {
         form1.listBox1.Items.Add(textBox1.Text);
     }
 }

Ještě si přidej do jmenného prostoru formů tuto třídu, která ti projede všechny otevřené formy a zjistí, jestli už ten daný form není otevřený.

public static class FormExtension
    {
        public static bool IsFormOpened(this Form formName)
        {
            FormCollection fc = Application.OpenForms;
            foreach (Form form in fc)
            {
                if (form.Text == formName.Text)
                {
                    return true;
                }
            }
            return false;
        }
    }
Editováno 12.12.2015 18:00
 
Nahoru Odpovědět
12.12.2015 17:58
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Antonín Tonini
Verquido:12.12.2015 18:15

Jasně chápu :) A ještě dotaz. CO přesně znamená tohle? :
Form1

form2 = new Form2(this);

Form2

public Form2(Form1 form)
this.form1 = form;
 
Nahoru Odpovědět
12.12.2015 18:15
Avatar
Odpovídá na Verquido
Antonín Tonini:12.12.2015 18:30
form2 = new Form2(this);

Tím vytvoříš novou instanci třídy Form2 a v do parametru vkládáš instanci třídy Form1 -> "this".

public Form2(Form1 form)
this.form1 = form;

"public Form2(Form1 form)" je konstruktor třídy Form2 a v parametru přijímáš instance třídy Form1. Zde si tedy přijal to "this" z prvního formu. Konstruktor ten přijatý parametr přiřadí do "private Form1 form1" ve druhé třídě a poté můžeš v rámci instance třídy Form2 pracovat s instancí třídy Form1.

Editováno 12.12.2015 18:30
 
Nahoru Odpovědět
12.12.2015 18:30
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Antonín Tonini
Verquido:12.12.2015 18:39

Zkopíroval jsem to tak jak je to tedy a stejně to nejde. Hlavní problém je asi to že to nepíše nic do druhého formu a když něco chci psát z druhého do prvního tak se otevře nový Form. A nevím co je špatně :/ Myslím si že jsem to všechno nakopíroval dobře tak nevím kde je chyba. Hodím sem celý projekt :)

Form1

namespace JakobyChat
{

    public static class FormExtension
    {
        public static bool IsFormOpened(this Form formName)
        {
            FormCollection fc = Application.OpenForms;
            foreach (Form form in fc)
            {
                if (form.Text == formName.Text)
                {
                    return true;
                }
            }
            return false;
        }
    }

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

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void btn_Send_Click(object sender, EventArgs e)
        {
            if (form2 != null && form2.IsFormOpened())
                form2.lbox_Chat.Items.Add(tb_Message.Text);
            else
            {
                form2 = new Form2(this);
                form2.Show();
                form2.lbox_Chat.Items.Add(tb_Message.Text);
            }
        }

    }
}

Form2

namespace JakobyChat
{

    public static class FormExtension
    {
        public static bool IsFormOpened(this Form formName)
        {
            FormCollection fc = Application.OpenForms;
            foreach (Form form in fc)
            {
                if (form.Text == formName.Text)
                {
                    return true;
                }
            }
            return false;
        }
    }

    public partial class Form2 : Form
    {
        private Form1 form1;
        public Form2(Form1 form)
        {
            InitializeComponent();
            this.form1 = form;
        }

        private void btn_Send_Click(object sender, EventArgs e)
        {
            form1.lbox_Chat.Items.Add(tb_Message.Text);
        }

    }
}
 
Nahoru Odpovědět
12.12.2015 18:39
Avatar
Antonín Tonini:12.12.2015 18:57

Nejprve z Form2.cs vymaž třídu FormExtension. FormExtension v tom jmenném prostoru už máš (ve Form1.cs), takže tu třídu uvidí každá třída, která je v tom jmenném prostoru. Editor neprotestoval?

 
Nahoru Odpovědět
12.12.2015 18:57
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Antonín Tonini
Verquido:12.12.2015 19:09

Ále protestoval, jenomže se mi z toho erroru nepodařilo vyčíst co je špatně. A už to funguje :) Jen se vždy první text neodešle . Ale když se 2 form otevře a pošlu ji znovu je tam.

 
Nahoru Odpovědět
12.12.2015 19:09
Avatar
Antonín Tonini:12.12.2015 19:20

Ten první text by se měl odeslat. Mně se vždy po otevření druhého zobrazí. Zkus to odkrokovat a jakmile to přejede přes form2.lbox_Chat­.Items.Add(tb_Mes­sage.Text);, tak se koukni do items, jestli je tam 1 položka (count).

 
Nahoru Odpovědět
12.12.2015 19:20
Avatar
ORRNY99
Člen
Avatar
ORRNY99:12.12.2015 19:39

Dobrej tutorial http://www.youtube.com/watch?…

Zkus to například takhle:

public static Form2 form2;
public Form2()
{
    InitializeComponent();
    form2 = this;
}


public static Form1 form1;
public Form1()
{
    InitializeComponent();
    form1 = this;

}

private void button1_Click(object sender, EventArgs e)
{
    Form2.form2.listBox1.Items.Add(this.textBox1.Text);
}
 
Nahoru Odpovědět
12.12.2015 19:39
Avatar
Odpovídá na ORRNY99
Antonín Tonini:12.12.2015 20:21

Do statické proměnné bych to nedával. Zpřístupnit všechno všem je ve většině případů nežádoucí. Krom toho stejně budeš muset tu instanci vytvořit, abys k ní mohl přistupovat, takže hodíš do konstruktoru Form1:

Form2 form2 = new Form2();

Takže zavoláš konstruktor Form2, ale tu proměnnou form2 už potom ve třídě Form1 vůbec nepoužiješ.

Editováno 12.12.2015 20:21
 
Nahoru Odpovědět
12.12.2015 20:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.