» »

[C#] Dostop do objekta iz različnih form

[C#] Dostop do objekta iz različnih form

iggy1 ::

Pozdravljeni!

Imam 2 formi recimo A in B. Na A formi imam objekt. Na B formi bi pa rad imel neko kodo ki bi delala s tem objektom. Recimo, da bi na formi B žele vpisati nek podatek. Ob kliku bi se forma zaprla in podatek bi se vpisal v objekt forme A. Ima kdo idejo kako bi dostopal do tega objekta?


Lp,
Igor

morbo ::

objekt najavi kot public static

iggy1 ::

Hvala bom probal!

frudi ::

da ne bi slučajno res delal česa takega... protection level se praviloma nastavlja toliko konzervativno, kolikor je možno. zaradi ene take malenkosti, kot je dostopnost iz dveh form, dvigovat protection level iz private/protected na public in hkrati še static, je izredno slaba praksa. sploh static pa s seboj prinese še kup problemov in tipično zgolj bolj zakomplicira situacijo.

na formi B deklariraj privatno spremenljivko, ki je istega tipa kot ta objekt in get/set metodi za njeno nastavljanje/branje. preden odpreš formo B, nastaviš vrednost te spremenljivke in potem na formi B enostavno delaš s to 'lokalno verzijo' objekta. 'lokalno' v narekovajih, ker gre še vedno za isto instanco objekta, na formi B imaš le drugo referenco nanj. ko na formi B spremeniš neko lastnost objekta, se bo to poznalo tudi na formi A...

nekaj takega... forma A:
private void DisplayFormB()
{
    FormB frm = new FormB();
    FormB.MyCustomObject = customObject;
    frm.ShowDialog();
}

forma B:
private MyCustomObjectType myCustomObject;
public MyCustomObjectType MyCustomObject
{
    get { return myCustomObject; }
    set { myCustomObject= value; }
}

private void SomeMethodToManipulateObject()
{
...
}
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

iggy1 ::

Kaj pa če je ta objekt dataGridView? Imam ga na formi A in bi želel nek podatek ko vpišem na formi B in kliknem OK da se forma B zapre ter se podatek prikaže v gridu.

morbo ::

Če iz form A odpiraš form B, potem grid podaj konstruktorju forme B.

Kekec ::

Še vedno obstaja možnost ko b formo zapreš prebereš to vrednost ki si jo nekam na tej formi zapisal in spremeniš grid view na a formi!

frudi ::

odvisno, kako polniš grid. sam bi formi B podal datasource od grida (tabela, dataset, collection, list... karkoli pač uporabljaš), po zgornji metodi, nato na formi B pač opravil z datasourcom, kar želim (dodaš/urediš elemente, presortiraš, karkoli) in po vrnitvi na formo B osvežil datagrid.

če pa slučajno formo B prikazuješ s .Show() in ne .ShowDialog(), pa bi lahko recimo dvignil protection level metodi za osveževanje/polnjenje datagrida na public in jo poklical kar s forme B. ali pa na formi B definiraš nek event, ki ga sprožiš po končanem urejanju, ga uloviš na formi A in sprožiš osveževanje grida. ali pa podaš formi B delegat od metode za osveževanje grida na formi A... možnosti imaš ogromno, odvisno kaj ti je pač bolj domače.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Kekec ::

Pomoje želi pač dodat nek record ali mogoče spremeniti kak field in pisanje delgatov in pošiljanje datasource na drugo forme se meni osebno ne zdi najlepši pristop.

frudi ::

sej sem napisal - delegati, eventi in podobno pride v poštev, če odpira formo v novem threadu, torej s .Show(). v tem primeru se ti izvajanje na formi A nadaljuje in ne moreš nadaljevati kode z logiko za dodajanje/urejanje zapisa v datasourcu. to logiko je treba pospravit v kako drugo metodo, ki jo pokličeš preko eventa ali delegata (itak isti šmorn).

pošiljanje reference na datasource je pa mogoče res overkill, če dodaja/ureja recimo posamezno skalarno vrednost. če pa manipuliraš s celotnimi zapisi v datasourcu, pa je precej elegantneje, da pošlješ datasource formi B in naj se ona sama ubada s tem, kako bo spremenila datasource. ali pa vsaj datarow, oziroma objekt, ki je vezan nanj. pa še nazaj ga ni treba prenašat, ker itak pošlješ samo referenco. lepše to, kot pa prekladat par skalarnih spremenljivk sem ter tja...
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

iggy1 ::

FORMA A:

public void Form1_Load(object sender, EventArgs e)
{

SqlConnection myconnection = null;
SqlDataAdapter myDataAdapter = null;

try
{
myconnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Visual Studio 2005\Projects\Imenik\Imenik\imenik.mdf;Integrated Security=True;User Instance=True");
myDataAdapter = new SqlDataAdapter("select upper (Stiki.Priimek)+ ' ' + upper (Stiki.Ime) as 'STIKI' , upper (Stiki.Dejavnost) as 'DEJAVNOST', Stevilka.Stevilka, Stevilka.GSM1, Stevilka.GSM2, Stevilka.Email from Stiki inner join Stevilka on Stiki.StikID = Stevilka.StikID order by Priimek asc", myconnection);
DataTable tb1 = new DataTable("Stiki");
myDataAdapter.Fill(tb1);
this.dataGridView1.DataSource = tb1;
}
catch (Exception ex)
{
MessageBox.Show("Napaka" + Environment.NewLine + ex.Message);
}
finally
{
if (myDataAdapter != null) {myDataAdapter.Dispose();}
if (myconnection != null) {myconnection.Dispose();}
}

Vnesite tukaj

private void button1_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Visual Studio 2005\Projects\Imenik\Imenik\imenik.mdf;Integrated Security=True;User Instance=True");
SqlCommand sc1 = new SqlCommand("INSERT INTO Stiki VALUES (@Priimek, @Ime, @Dejavnost) select @@IDENTITY as StikID", connection);
SqlCommand sc2 = new SqlCommand("INSERT INTO Stevilka (stevilka, gsm1, gsm2, email, stikid)VALUES (@Stevilka, @GSM1, @GSM2, @Email, @@identity)", connection);
sc1.Parameters.AddWithValue("@Priimek", textBox1.Text);
sc1.Parameters.AddWithValue("@Ime", textBox2.Text);
sc1.Parameters.AddWithValue("@Dejavnost", comboBox1.Text);
sc2.Parameters.AddWithValue("@Stevilka", textBox3.Text);
sc2.Parameters.AddWithValue("@GSM1", textBox4.Text);
sc2.Parameters.AddWithValue("@GSM2", textBox5.Text);
sc2.Parameters.AddWithValue("@Email", textBox6.Text);
connection.Open();
int i = sc1.ExecuteNonQuery();
sc2.ExecuteNonQuery();

}

Se pravi na formi A(Imenik) imam dataGridVIew. Na formi B(Nov) pa vpišeš recimo nov stik in ko klikneš gumb OK se ta shrani v bazo. Jaz pa bi želel, da ko se forma B zapre se podatek takoj prikaže v Gridu na formi A. Mi lahko kdo naredi konkreten primer za to?

Kekec ::

Uporabi get/set za vnosna polja na formi b,uporabi showdialog, poglej si DialogResult v MSDN-ju in je stvar resena! In lahko potem tudi formo ponovno uporabis ce bos zelel popravljat podatke, mislim imeti formo za popravlanje ce se je kje zmotil...

iggy1 ::

Ne gre mi a mi lahko kdo pomaga s kakšno kodo?

Kekec ::

KAter del ti tocno ne gre?

iggy1 ::

Najbolj mi boš pomaga,l če mi napišeš kodo za naslednji primer:
Imaš dve formi A in B.
A forma vsebuje en button ter en label.
B forma vsebuje en textBox in en button

Ko na formi A klikneš button se odpre forma B. Ko v B formi vtipkaš poljubno besedilo in klikneš button se label na formi A spremeni v vtipkan text.

iggy1 ::

Ne morem nikakor pogruntati kako recimo ko formo B ohranim vrednost ki je bila vpisana.

Forma A :

private void button2_Click(object sender, EventArgs e)
{
objects myobjects = new objects();
label1.Text = myobjects.MyCustomObject;
}

Forma B :

private void button1_Click(object sender, EventArgs e)
{
objects myobjects = new objects();
myobjects.MyCustomObject = textBox1.Text;
Form1 b = new Form1();
b.ShowDialog();


}

Razred objects:


class objects
{
private string myCustomObject;


public string MyCustomObject
{
get { return myCustomObject; }
set { myCustomObject = value; }
}

Kekec ::

a mi das email na zs da ti poslem kodo ker ce bom sam en del copy/paste-al in ce nebos uporabil ista imena nebo delalovalo!
lp

iggy1 ::

igor.stojcevic@gmail.com

Hvala!

Kekec ::

Poslano


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# težava

Oddelek: Programiranje
233751 (2597) mladec
»

[C#,SQL]

Oddelek: Programiranje
51257 (1170) JanOlMajti
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61147 (1023) detroit
»

C# okna in podokna

Oddelek: Programiranje
111663 (1257) FlashM
»

[C#] Query in code

Oddelek: Programiranje
261829 (1573) iggy1

Več podobnih tem