Status bar form MDIParent

giovedì 25 ottobre 2007 - 15.01

walteroli Profilo | Newbie

Ciao a tutti,
ho un problema di questo tipo: ho una tipica applicazione Windows composta da una form Form MDIParent che richiama al suo interno delle Form MDIChild.
Nella form MDIParent c'è una status bar con una serie di info tra cui Data,Utente e Lingua e mi piacerebbe farci apparire anche i messaggi (Informativi, Warning ed Rrror che siano). L'unica cosa è che i messaggi vengono generati all'interno delle Form MDIChild. Come posso portarle verso il Padre considerando che non posso referenziare il padre nel figlio xchè lo faccio già nel senso opposto?
Ho pensato ad un evento, ma anche in questo caso mi pianto...

Che posso fare???

Anticipatamente grazie.

Walter

freeteo Profilo | Guru

ciao,
devi dare alla form MdiContainer una proprieta' che "rimappa" sul Text della tua statusLabel.
Poi da dentro alle varie form child vai a settare il testo che vuoi tramite questa proprieta', usando la proprieta' "MdiParent" della form child, castandola alla tua MdiContainer.

In poche parole un codice di questo tipo:
//---- questa è la MDICONTAINER public partial class MainForm : Form { public string Messaggio { get { return this.toolStripStatusLabel1.Text; } set { this.toolStripStatusLabel1.Text = value; } } ...


Nella child dove mi serve faccio:
private void button1_Click(object sender, EventArgs e) { MainForm frm = this.MdiParent as MainForm; frm.Messaggio = "ciao ciao"; }
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

walteroli Profilo | Newbie

Cavolo, potevo pensarci anch'io con un po' più di lucidità!

Grazie 1000

Walter

walteroli Profilo | Newbie

Scusa, ma ho provato ad applicare la soluzione e non ci riesco xchè ho tralasciato un "piccolo" particolare:
la form MDI e la form che viene richiamata sono in due progetti diversi e il progetto in cui c'è la form MDI (chiamante) referenzia l'altro (chiamato), per cui dal chiamato non vedo gli oggetti del chiamante e l'istruzione
MainForm frm = this.MdiParent as MainForm;
non la posso scrivere...


Altre idee?

Grazie, Walter

freeteo Profilo | Guru

ciao,
se in un progetto hai referenziato un'altro progetto, ti basta mettere "public" la classe "MainForm" e la devi vedere, quindi puoi fare il cast...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

walteroli Profilo | Newbie

Forse continuo a non spiegarmi:

ho un progetto in cui c'è l'MDIParent che chiama tutte le altre form; nell'MDIParent c'è anche la status bar famosa.
Tale progetto referenzia al suo interno un altro progetto in cui c'è la Form1 che restituirà il messaggio alla MDIParent.
Il problema è che dalla Form1 del secondo progetto, essendo esso referenziato e non referenziante, non riesco a vedere l'MDIParent.

Grazie, Walter

freeteo Profilo | Guru

ah ok in questo caso allora devi farti dire dal referenziato qualcosa, tipicamente tramite eventi.
L'uso di eventi in questo caso è utile proprio perche' quello che deve comunicare scatena l'evento (passandoti proprio il testo da scrivere come argomento del delegate) e tu intercettando l'evento hai quel parametro da poter scrivere nella MdiPArent.

Esempietto chiarificatore:


FrmChild dell'altro prj
----------------------------


public partial class FormReferenziata: Form
{
public delegate void DelegatoMessaggio(string messaggio);
public event DelegatoMessaggio SegnalaMessaggio;
....


MdiForm
---------------
...
FormReferenziata frm = new FormReferenziata();
frm.SegnalaMessaggio += new DelegatoMessaggio(mioEvento);
frm.Show();
...

void mioEvento(string messaggio)
{
this.StatusBarlLabel.Text = messaggio;
.....


Tu devi decidere dentro alla "FormReferenziata" quando scatenare l'evento "SegnalaMessaggio", magari quando parte un processo, quando cliccano un bottone etc...passandogli il messaggio da visualizzare.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

walteroli Profilo | Newbie

Ho creato gli elementi come mi hai illustrato nell'esempio, ma c'è ancora qualcoa che mi blocca:

quando richiamo SegnalaMessaggio all'interno della form referenziata per fargli scatenare l'evento mi dice "Riferimento a un oggetto non impostato su un'istanza di oggetto."...

Non capisco

freeteo Profilo | Guru

ciao,
probabilmente chiami l'evento senza che nessuno si sia sottoscritto allevento (codice "... += ..." ), e infatti il codice tipico per scatenare gli eventi è proprio il controllo che non sia nullo, in questo modo:

.... if (SegnalaMessaggio != null) SegnalaMessaggio("messaggio"); ....

Questo controllo sostanzialmente dice: "se qualcuno è in ascolto sull'evento, lo scateno", verifica se è questo il problema che hai...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

walteroli Profilo | Newbie

Adesso sì che iniziamo a ragionare...

Grazie, il tuo aiuto è stato molto prezioso!

Walter

freeteo Profilo | Guru

era quello il problema allora?
Se hai risolto accetta una risposta cosi' chiudiamo il thread.
Grazie.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5