Come ho detto prima, le cose non vanno confuse. Form1 è il nome della classe, non dell'istanza del form visualizzato. Quindi quando dall'esterno vedi Form1, non vedi il form, ma solo la classe che lo definisce. Il tuo Form1 è di tipo Form1, e il parametro deve essere di tipo Form1. Tutto qui.
Un esempio:
codice:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Prova x = new Prova(this);
this.label1.Text="";
x.Richiama("Prova");
}
}
public class Prova
{
Form1 ParentForm;
public Prova(Form1 Parent)
{
ParentForm = Parent;
}
public void Richiama(string Val)
{
MyParent.label1.Text = Val;
}
}
Per far capire, il seguente codice definisce una classe:
codice:
public class Prova
{
int a;
static string b;
void UnaRoutine()
{
a = 1;
b = "Prova";
}
void UnAltraRoutine()
{
a = 2;
b = "Prova N. 2";
}
}
Il seguente codice definisce una serie di istanze di quella classe:
codice:
Prova x1,x2;
Prova[] PrArr;
x1 e x2 sono istanze di quella classe, Prova è un array di istanze di quella classe.
Se io faccio x1.a = 4 e x2.a = 17, le due istanze avranno il valore a pari a 4 e 17 rispettivamente.
Gli oggetti facenti parte della classe possono essere definiti rispetto alla classe solo se dichiarati statici (come b).
Se io faccio x1.UnaRoutine, sia x1.b che x2.b saranno pari a "Prova" perché la variabile b viene impostata sulla classe e non sulle istanze.
In questo caso posso fare anche Prova.b = "Qualcosa".
Fin qui è chiaro?
A questo punto devi considerare che il Form1 è paragonabile a Prova, e il form che vedi sullo schermo è come x1 (anche se non esiste nessuna variabile, eccetto this, a cui tale form si riferisce), e che la label è come la variabile a, e non come la variabile b.
Per farte in modo che la variabile a sia visibile da un'altra classe, devi passare this al di fuori di Form1. Tutto qui