Avatar
Paranormal
Redaktor
Avatar
Paranormal:

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  +1 12.12.2015 15:08
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Antonín Tonini:

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  +1 12.12.2015 17:58
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Antonín Tonini
Paranormal:

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
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Odpovídá na Paranormal
Antonín Tonini:
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  +2 12.12.2015 18:30
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Antonín Tonini
Paranormal:

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
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Antonín Tonini:

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
Paranormal
Redaktor
Avatar
Odpovídá na Antonín Tonini
Paranormal:

Á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
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Antonín Tonini:

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:

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:

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  +3 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.