View Full Version : [C#] Passaggio dati tra form
Kintaro10
12-03-2008, 11:13
Ave truppa!
Ho iniziato da poco a fare c#, ed ho un piccolo problema: come passo dati tra due form (ad esempio form1 e form2)? Ho trovato un paio di soluzioni su internet ma non vanno... Chi mi fa vedere del codice funzionante?
Grazie in anticipo, ciao!
WhiteWolf42
12-03-2008, 14:48
semplicemente modifichi il costruttore del form "chiamato" affinchè accetti un certo numero di parametri e glieli passi al momento della chiamata
dal form chiamante
TipoForm formChiamato = new TipoForm(tipo param1, tipo param2, tipo param3);
nel form chiamato:
public TipoForm (tipo p1,tipo p2,tipo p3){
.....
}
Kintaro10
12-03-2008, 15:25
Ok grazie della risposta. Ciò che dici vale nel caso io voglia passare dati dal form principale a quello che apro.
Se invece io volessi fare l'inverso? Ad esempio, da form1 apro form2, in quest'ultimo prendo (tramite textbox ad esempio) due stringhe e voglio riportarle nel form1. Come potrei fare?
astorcas
12-03-2008, 15:30
potresti fare uso di una classe statica ed utilizzarla come "contenitore"
WhiteWolf42
12-03-2008, 15:49
semplicemente ... al posto di passargli dei tipi semplici (int, long) gli passi un tipo complesso. I tipi complessi non vengono "passati" via "value", ma via "reference", per cui le modifiche e le valorizzazioni che tu farai nell form chiamato verranno perpetrati anche nel form chiamante.
WhiteWolf42
12-03-2008, 15:50
potresti fare uso di una classe statica ed utilizzarla come "contenitore"
non è molto "pulita" come soluzione, ma può sempre andare bene.
astorcas
12-03-2008, 16:06
semplicemente ... al posto di passargli dei tipi semplici (int, long) gli passi un tipo complesso. I tipi complessi non vengono "passati" via "value", ma via "reference", per cui le modifiche e le valorizzazioni che tu farai nell form chiamato verranno perpetrati anche nel form chiamante.
io suggerirei di usare il parametro "ref"
non è molto "pulita" come soluzione, ma può sempre andare bene.
Hai ragione ma è molto pratica :)
WhiteWolf42
12-03-2008, 16:14
Hai ragione ma è molto pratica :) assolutamente ... ma lasciami dire una cosa ... quando hai anche fare con programmini semplici e sei solo tu a metterci le mani è una libidine utilizzare queste soluzzioni ... ma quando sei in un team di 15 persone che fanno cose diverse, con stili diveri ... o rispetti gli standard o nel sotto terra (come me in questo momento ... e per la pazzia cazzeggio qui)
astorcas
12-03-2008, 16:20
assolutamente ... ma lasciami dire una cosa ... quando hai anche fare con programmini semplici e sei solo tu a metterci le mani è una libidine utilizzare queste soluzzioni ... ma quando sei in un team di 15 persone che fanno cose diverse, con stili diveri ... o rispetti gli standard o nel sotto terra (come me in questo momento ... e per la pazzia cazzeggio qui)
senza dubbio! e poi bisogna essere consapevoli del fatto che usare una classe statica significa condividerla fra tutte le istanze dell'applicazione ... prendi chessò una web application e questa soluzione bisogna scordarsela!
Cmq idem per team, pazzia e cazzeggio (ti capisco :-P)
Kintaro10 facci sapere cosa decidi!
Kintaro10
12-03-2008, 23:14
Innanzitutto vi ringrazio per le risposte.
Ho usato il metodo ref, per l'esattezza ho passato in riferimento il form uno al form due, facendo in quest'ultimo un overloading del costruttore. In questa maniera dal secondo form ho accesso alle variabili ed ai metodi pubblici del primo form.
Dite che va bene passare in riferimento tutto il form, oppure può creare problemi?
Comunque grazie ancora, a presto!
astorcas
13-03-2008, 09:22
Innanzitutto vi ringrazio per le risposte.
Ho usato il metodo ref, per l'esattezza ho passato in riferimento il form uno al form due, facendo in quest'ultimo un overloading del costruttore. In questa maniera dal secondo form ho accesso alle variabili ed ai metodi pubblici del primo form.
Dite che va bene passare in riferimento tutto il form, oppure può creare problemi?
Comunque grazie ancora, a presto!
Non dovrebbe crearne no, l'importane è che maneggi il form con cura! Però a questo punto ti suggerirei di usare una cosa tipo:
Form2 f2=new Form2();
f2.ShowDialog(this);
All'interno di un evento di Form1. In questo modo blocchi Form1 e inoltre quel this sta ad indicare che Form1 è l'Owner di f2 e quindi può essere referenziato con f2.Owner.
Magari è ancora meglio ;)
Kintaro10
13-03-2008, 10:31
Ho usato una cosa simile, cioè all'interno di un evento di form1, ho messo:
Form me = this;
Form2 due = new Form2(ref me);
due.Show();
:)
kernel::panic
13-03-2008, 10:48
Siccome Form è una classe e non una struttura il "ref" non serve... le classi vengono sempre passate byref.
astorcas
13-03-2008, 11:13
Siccome Form è una classe e non una struttura il "ref" non serve... le classi vengono sempre passate byref.
non vorrei dire una cavolata ma credo che ci sia una differenza, senza il ref non è un vero passaggio per riferimento ma un passaggio "per valore del riferimento", cioè puoi aggiornare tutti i campi della classe ma non il suo riferimento. Qualcuno conferma?
Kintaro10
13-03-2008, 12:11
Se fosse vero, che problemi si potrebbero creare?
kernel::panic
13-03-2008, 13:04
non vorrei dire una cavolata ma credo che ci sia una differenza, senza il ref non è un vero passaggio per riferimento ma un passaggio "per valore del riferimento", cioè puoi aggiornare tutti i campi della classe ma non il suo riferimento. Qualcuno conferma?
E' corretto, mi ero spiegato male io prima. ;)
Per quanto riguarda le classi, l'uso del ref serve solo se nella funzione si vuole modificare il valore del puntatore alla classe (con una new o attribuendo il puntatore ad un'altra classe). Ad esempio:
class A
{
public int I = 0;
}
static void ConRef(ref A a)
{
a.I = 1;
a = new A();
}
static void SenzaRef(A a)
{
a.I = 1;
a = new A();
}
static void Main()
{
A a = new A();
Console.WriteLine("Caso 1: " + a.I); // I vale 0
ConRef(ref a);
Console.WriteLine("Caso 2: " + a.I); // I vale 0 -> la classe è stata reinizializzata
SenzaRef(a);
Console.WriteLine("Caso 3: " + a.I); // I vale 1 -> la classe è stata modificata
Console.ReadKey();
}
Ciao :)
astorcas
13-03-2008, 14:00
Per quanto riguarda le classi, l'uso del ref serve solo se nella funzione si vuole modificare il valore del puntatore alla classe (con una new o attribuendo il puntatore ad un'altra classe). Ad esempio:
class A
{
public int I = 0;
}
static void ConRef(ref A a)
{
a.I = 1;
a = new A();
}
static void SenzaRef(A a)
{
a.I = 1;
a = new A();
}
static void Main()
{
A a = new A();
Console.WriteLine("Caso 1: " + a.I); // I vale 0
ConRef(ref a);
Console.WriteLine("Caso 2: " + a.I); // I vale 0 -> la classe è stata reinizializzata
SenzaRef(a);
Console.WriteLine("Caso 3: " + a.I); // I vale 1 -> la classe è stata modificata
Console.ReadKey();
}
Ciao :)
Ok era quello che intendevo, grazie! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.