Component in C#

venerdì 07 dicembre 2007 - 10.05

Ansl72 Profilo | Newbie

Salve a tutti,

ho un problema con un userControl creato come un'istanza singleton. In pratica in pratica ho due form dove ho inserito questo controllo da me creato (questo controllo contiene due label: lblgruppo, lblnome e una picturebox)

i due form sono:

1) mainForm
2) subForm

in entrambi ci sono una texBox e un pulsante quello che faccio io e che premendo il pulsante la label "lblgruppo" contenuta nel "controllo da me creato" viene valorizzata con il contenuto della textBox e questo da entrambi i form.

questo è il codice del mio UserControl:


namespace DeviceApplication1 {
public sealed partial class Intestazione : UserControl {

private Intestazione() {
InitializeComponent();
}

public static readonly Intestazione IlSoloEUnico = new Intestazione();

public string getGruppo() {
return lblGruppo.Text;
}

public void setGruppo(string valore) {
lblGruppo.Text = valore;

}

public string NomeUtente {
get { return lblNomeUtente.Text; }
set { lblNomeUtente.Text = value; }
}
}
}

questo è invece il codice del mainForm:

namespace DeviceApplication1 {
public partial class frmMain : Form {
public frmMain() {
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e) {
mioControllo.setGruppo(textBox1.Text);
}

private void btnForm2_Click(object sender, EventArgs e) {
frmSub form2 = frmSub.instanzaForm;
form2.Show();

}

private void frmMain_Activated(object sender, EventArgs e) {
mioControllo.Show();
mioControllo.Visible = true;
}


}

Ora il problema è che chiamando il secondo form e richiudendolo quando ritorno nel formMain mi scompare il controllo da me creato.
Ho provato come si vede dal codice all'evento Activate di abiltare le proprietà Show e Visible ma niente il controllo non si vede! però so che c'è per se aggiorno la label e riapro il secondo form (subForm) il controllo si vede e la label.text è aggiornata.

spero di essere stato un pochino chiaro :-))))

Grazie
Ansl72

freeteo Profilo | Guru

ciao,
per creare un componente ti basta aggiungere un progetto di tipo "libreria di componenti" per smart device.
Di default visual studio ti crea un controllino, tu puoi rinominare/cancellare a tuo piacimento, ma come vedi per avere la possibilita' di disegnarti dentro all'ambiente il tuo componente (quindi aggiungendo le label e l'immagine etc...) deve essere un'estensione di "UserControl".

Dopodiche puoi aggiungere delle proprieta' al controllo stesso, in modo che nelle varie form dell'applicazione palmare vai a settare quelle. Dentro al "set" di quelle, implementi la tua logica (tipo scrivi il valore sulla textbox) etc..

Nel tuo progetto di mobile, fai riferimento a questo progetto, in modo che alla prima compilazione ti compaia da solo nella toolbar il tuo componente, trascinabile dentro alle varie form.


Se vuoi che quando una di queste form setta il valore delle tue proprieta' siano visibili alle altre form, devi usare delle proprieta' che utilizzano internamente una variabile privata "statica" in modo che ci sia una sola istanza del loro valore:
Esempio di controllo banale:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace SmartDevice.Controls { public partial class TestoImmagine : UserControl { static string testo; public string Testo { get { return testo; } set { testo = value; } } public TestoImmagine() { InitializeComponent(); } protected override void OnPaint(PaintEventArgs e) { label1.Text = testo; base.OnPaint(e); } } }

ciao.

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

Ansl72 Profilo | Newbie

>ciao,
>per creare un componente ti basta aggiungere un progetto di tipo
>"libreria di componenti" per smart device.
>Di default visual studio ti crea un controllino, tu puoi rinominare/cancellare
>a tuo piacimento, ma come vedi per avere la possibilita' di disegnarti
>dentro all'ambiente il tuo componente (quindi aggiungendo le
>label e l'immagine etc...) deve essere un'estensione di "UserControl".
>
>Dopodiche puoi aggiungere delle proprieta' al controllo stesso,
>in modo che nelle varie form dell'applicazione palmare vai a
>settare quelle. Dentro al "set" di quelle, implementi la tua
>logica (tipo scrivi il valore sulla textbox) etc..
>
>Nel tuo progetto di mobile, fai riferimento a questo progetto,
>in modo che alla prima compilazione ti compaia da solo nella
>toolbar il tuo componente, trascinabile dentro alle varie form.
>
>
>Se vuoi che quando una di queste form setta il valore delle tue
>proprieta' siano visibili alle altre form, devi usare delle proprieta'
>che utilizzano internamente una variabile privata "statica" in
>modo che ci sia una sola istanza del loro valore:
>Esempio di controllo banale:
>
>
>using System;
>using System.Collections.Generic;
>using System.ComponentModel;
>using System.Drawing;
>using System.Data;
>using System.Text;
>using System.Windows.Forms;
>
>
>namespace SmartDevice.Controls
>{
> public partial class TestoImmagine : UserControl
> {
> static string testo;
> public string Testo {
> get { return testo; }
> set { testo = value; }
> }
>
>
>
> public TestoImmagine()
> {
> InitializeComponent();
> }
>
> protected override void OnPaint(PaintEventArgs e)
> {
> label1.Text = testo;
> base.OnPaint(e);
> }
> }
>}
>
>ciao.
>
>Matteo Raumer
>[MCAD .net]
>http://blogs.dotnethell.it/freeteo

scusa io sono un pò bianco in c# non ho capito bene, a me serve che il controllo sia istanziato una sola volta (come singleton) per cui se ad esempio ho un FormMain che valorizza la mia label e poi da qui chiamo un altro Form2 (in questo ci sarà un'altra istanza ? o no)

freeteo Profilo | Guru

ciao,
no se usi singleton, usi un solo componente in memoria, quindi qualsiasi sia la classe (e la form è cmq una classe del framework) che lo usa, torna sempre lo stesso oggetto, quindi se in una form lo modifichi, quando apri l'altra form lo trovi modificato.

L'unica cosa da stare attento, è che se vuoi che le operazioni vengano visualizzate in tempo reale, devi gestirti l'evento "OnPaint" in "override".Questo evento è scatenato ogni volta lo "vedi" a video, ovvero windows chiama il suo "Paint" e lo disegna (purcui se metti un breakpoint ci passa 3000 volte)

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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5