Diskuze: informace pro 2 Formy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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;
}
}
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;
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.
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);
}
}
}
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?
Á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.
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_Message.Text);, tak se koukni do items, jestli je tam 1 položka (count).
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);
}
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š.
Zobrazeno 10 zpráv z 10.