View Full Version : [c#] domanda semplice: Come agggiornare una textbox?
Ciao
Ho scritto un programma in c#.
Ho delle textbox, che in tutti gli altri programmi fatti le aggiornavo solo con un textbox.text = "qui metto la frase";
Ora ho un programmino così fatto:
private void BottoneStart_Click(object sender, EventArgs e)
{
textbox.text = "Ciao";
while (true)
{
qui il while fa delle cose all'infinito perchè l'utente ha premuto il bottone, e deve farle fino alla chiusura
}
}
ebbene il semplice problema è che il textbox non viene scritto con "ciao". Se però ad un certo punto metto un brack dentro il while (cioè esce dal while), allora mi aggiorna la scritta. Come mai?
Perchè aggiorna la textbox all'uscita dal metodo, quindi alla fine del while...ma siccome il while è true...:D
Perchè aggiorna la textbox all'uscita dal metodo, quindi alla fine del while...ma siccome il while è true...:D
noooooooooooo. Non c' è modo di ovviare?
Prova così....
private void BottoneStart_Click(object sender, EventArgs e){
this.textBox.Text="ciao";
this.textBox.Refresh();
while(true)
{}
}
Prova così....
private void BottoneStart_Click(object sender, EventArgs e){
this.textBox.Text="ciao";
this.textBox.Refresh();
while(true)
{}
}
ok grazie mille.
Ne approfitto per chiedervi un altra cosina (sto passando a c# dall'asse,bler e dal c puro, quindi trovo qualche problemino).....
ho creato un appliczione multi-trheaded. Ma se da un thread provo ad aggiornare una textbox (ad esempio), dice il debugger (uso visual c#), che sto accedendo al controllo da un thread diverso da quello di creazione.
Ma come posso risolvere? In c avrei messo un bel puntatore e via, ma c# non lo permette....
class BackgroundWorker
Questo è più complicato da spiegare :cool:
La cosa migliore è vedere la documentazione microsoft http://msdn2.microsoft.com/it-it/library/c8dcext2(VS.80).aspx
class BackgroundWorker
Questo è più complicato da spiegare :cool:
La cosa migliore è vedere la documentazione microsoft http://msdn2.microsoft.com/it-it/library/c8dcext2(VS.80).aspx
ok grazie del link, ora vado a leggere.... Ciao
class BackgroundWorker
Questo è più complicato da spiegare :cool:
La cosa migliore è vedere la documentazione microsoft http://msdn2.microsoft.com/it-it/library/c8dcext2(VS.80).aspx
Non riesco a capire purtroppo. Puoi spiegarmelo te? Tutto ciò che devo fare è aggiornare dei textbox (cioè devo aggiornargli il testo)....
ho infatti provato ad usare il BackgroundWorker, mettendo in BackgroundWorker_completed la textbox.text = "CIAO";. Ma dà sempre lo stesso errore.
ecco il programma che da erroer, privato delle funzioni inutili
namespace WindowsApplication1
{
public partial class Form1 : Form
{
SerialPort seriale = new SerialPort("COM3", 4800, Parity.None, 8, StopBits.One);
public Form1()
{
InitializeComponent();
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Textbox.Text = "CIAO";
}
private void BottoneStart_Click(object sender, EventArgs e)
{
seriale.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
seriale.Open();
}
}
}
Il componente backgroundWorker è lanciato dal form principale.
In modo che possa poi aggiornare la textbox
namespace WindowsApplication1{
public partial class Form1 : Form{
SerialPort seriale = new SerialPort("COM3", 4800, Parity.None, 8, StopBits.One);
public Form1(){
InitializeComponent();
}
// lavoro fatto in background
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){
BackgroundWorker bw = sender as BackgroundWorker;
int arg = (int)e.Argument;
seriale.DataReceived += new serialDataReceivedEventHandler(port_DataReceived);
// e.result prende il risultato dell'operazione
e.Result = seriale.Open();
}
private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e){
Textbox.Text = "CIAO";
}
private void BottoneStart_Click(object sender, EventArgs e)
{
// par se vuoi passare parametri
this.backgroundWorker1.RunWorkerAsync(par);
// il componente background lavora su un thread separato
}
//textbox da aggiornare
private System.Windows.Forms.TextBox textBox1;
private System.ComponentModel.BackgroundWorker backgroundWorker;
}
}
Il componente backgroundWorker è lanciato dal form principale.
In modo che possa poi aggiornare la textbox
namespace WindowsApplication1{
public partial class Form1 : Form{
SerialPort seriale = new SerialPort("COM3", 4800, Parity.None, 8, StopBits.One);
public Form1(){
InitializeComponent();
}
// lavoro fatto in background
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){
BackgroundWorker bw = sender as BackgroundWorker;
int arg = (int)e.Argument;
seriale.DataReceived += new serialDataReceivedEventHandler(port_DataReceived);
// e.result prende il risultato dell'operazione
e.Result = seriale.Open();
}
private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e){
Textbox.Text = "CIAO";
}
private void BottoneStart_Click(object sender, EventArgs e)
{
// par se vuoi passare parametri
this.backgroundWorker1.RunWorkerAsync(par);
// il componente background lavora su un thread separato
}
//textbox da aggiornare
private System.Windows.Forms.TextBox textBox1;
private System.ComponentModel.BackgroundWorker backgroundWorker;
}
}
Ciao
Stasera quando torno a casa provo. Ti ringrazio davvero. Se c' è un modo per sdebitarmi dimmelo. Grazie ancora
ciao
Ho provato, ma mi dice:
Errore 5 'WindowsApplication1.Form1' does not contain a definition for 'backgroundWorker1'
in effetti quel backgroundworker1 è presente solo alla fine. Prima non è mai presente quel 1 alla fine.
hai due scelte
Cambiare backgroundWorker1 in backgroundWorker
oppure tutti i backgroundWorker in backgroundWorker1
hai definito il componente
private System.ComponentModel.BackgroundWorker backgroundWorker;
da richiamare qui
private void BottoneStart_Click(object sender, EventArgs e)
{
// par se vuoi passare parametri
this.backgroundWorker1.RunWorkerAsync(par);
// il componente background lavora su un thread separato
}
hai due scelte
Cambiare backgroundWorker1 in backgroundWorker
oppure tutti i backgroundWorker in backgroundWorker1
hai definito il componente
private System.ComponentModel.BackgroundWorker backgroundWorker;
da richiamare qui
private void BottoneStart_Click(object sender, EventArgs e)
{
// par se vuoi passare parametri
this.backgroundWorker1.RunWorkerAsync(par);
// il componente background lavora su un thread separato
}
ok grazie ancora. Ora non ti disturberò più. Promesso. Ciao
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.