PDA

View Full Version : [c#] domanda semplice: Come agggiornare una textbox?


giova22
12-11-2007, 10:34
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?

APekos
12-11-2007, 10:45
Perchè aggiorna la textbox all'uscita dal metodo, quindi alla fine del while...ma siccome il while è true...:D

giova22
12-11-2007, 10:47
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?

lattone
12-11-2007, 11:18
Prova così....

private void BottoneStart_Click(object sender, EventArgs e){
this.textBox.Text="ciao";
this.textBox.Refresh();
while(true)
{}
}

giova22
12-11-2007, 11:23
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....

lattone
12-11-2007, 12:06
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

giova22
12-11-2007, 12:12
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

giova22
12-11-2007, 13:49
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)....

giova22
12-11-2007, 15:03
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();

}

}
}

giova22
13-11-2007, 10:39
uppino

lattone
13-11-2007, 11:48
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;
}
}

giova22
13-11-2007, 15:19
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

giova22
15-11-2007, 18:33
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.

lattone
17-11-2007, 20:32
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
}

giova22
18-11-2007, 15:09
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