Modificare textbox da evento esterno alla grid

lunedì 16 giugno 2014 - 14.51
Tag Elenco Tags  C#  |  Visual Studio 2010

_Andreino10 Profilo | Newbie

Salve a tutti,
Non riesco a modificare il contenuto di una textbox con un evento esterno alla grid..
Io ricevo una stringa sulla porta seriale, (con l'evento DataReceivedHandler) e poi vorrei scriverla in una textbox..
Come posso fare?
Grazie..

namespace telecomando_macchinina
{
/// <summary>
/// Logica di interazione per MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
SerialPort _porta = new SerialPort();

public MainWindow()
{
InitializeComponent();
comboBox1.Items.Add("COM1");
comboBox1.Items.Add("COM2");
comboBox1.Items.Add("COM3");
comboBox1.Items.Add("COM4");
comboBox1.Items.Add("COM5");
comboBox1.Items.Add("COM6");
comboBox1.Items.Add("COM7");
comboBox1.Items.Add("COM8");
comboBox1.Items.Add("COM9");

_porta.BaudRate = 9600;
_porta.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
intestazione.Text = "Premi il pulsante 'Connetti' per poter telecomandare l'automobile.\nComandi:\nW = Avanti, S = Indietro, A = Sinistra, D = Destra";
}

public TextBox boxDistanza
{
set
{
Box_distanza = value;
}

}

public SerialPort Porta
{
get
{
return _porta;
}
}


public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
//---> Quale istruzione inserisco qui??<--
}
}

0v3rCl0ck Profilo | Guru

>
>public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs
>e)
> {
> SerialPort sp = (SerialPort)sender;
> string indata = sp.ReadExisting();
> //---> Quale istruzione inserisco qui??<--
> }
>}
>

ma il tuo problema è semplicemente comunicare con la textbox? che è del tutto simile a come hai fatto per la combobox, tipo this.textbox.text = "asdasda"

oppure ti sta dando un errore?

se è il caso dell'errore, probabilmente l'evento DataReceived esegue il tuo metodo su un altro thread, e non puoi toccare elementi di UI se non sei sul thread appunto della UI.


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

Esatto, penso che sia la seconda ipotesi.. come posso risolvere in tal caso? non c'è modo?

0v3rCl0ck Profilo | Guru

>Esatto, penso che sia la seconda ipotesi.. come posso risolvere
>in tal caso? non c'è modo?

si certo che si può, è perfettamente ragionevole eseguire codice in un altro thread, anche un semplice System.Timers.Timer, esegue la sua callback in un altro thread.

ad oggi ci sono svariati modi per ritornare sul thread principale, in generale tutti i metodi riguardano un contesto di sincronizzazione, ma nello specifico dipende su che piattaforma stai sviluppando, windows forms o WPF?


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

wpf..

0v3rCl0ck Profilo | Guru

così:

this.Dispatcher.Invoke(() => { // qui metti le istruzioni che devono accedere alla UI come ad esempio: this.textBlock.Text = "Ciao Mondo!"; });

public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); this.Dispatcher.Invoke(() => { this.textBlock.Text = "Ciao Mondo!"; }); }

Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

Ok scusa l'ultimo dubbio, this starebbe per la MainWindow?

0v3rCl0ck Profilo | Guru

>Ok scusa l'ultimo dubbio, this starebbe per la MainWindow?
>

si, puoi anche ometterlo


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

Il codice che mi hai dato te, funziona solamente nei corpi degli eventi ativati dalla UI (quindi negli eventi attivati dai click dei bottoni..).
Nel corpo dell'evento che si attiva con la ricezione di dati dalla seriale il "this" non esiste..
Vuoi che posto l'intero codice? così magari ti è più chiaro e riesci a spiegarmi meglio..

0v3rCl0ck Profilo | Guru

perchè hai dichiarato il metodo statico:

public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

e sufficiente che togli static:

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

Ops.. hai ragione scusa!

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.Dispatcher.Invoke(() =>
{
this.Box_distanza.Text = "Ciao Mondo!";
});
}

comunque ho questo errore:
Errore 1 Impossibile convertire espressione lambda nel tipo 'System.Delegate' perché non è un tipo delegato

0v3rCl0ck Profilo | Guru

>Ops.. hai ragione scusa!
>
>public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs
>e)
> {
> SerialPort sp = (SerialPort)sender;
> string indata = sp.ReadExisting();
> this.Dispatcher.Invoke(() =>
> {
> this.Box_distanza.Text = "Ciao Mondo!";
> });
> }
>
>comunque ho questo errore:
>Errore 1 Impossibile convertire espressione lambda nel tipo 'System.Delegate'
>perché non è un tipo delegato

ok perchè stai compilando in 4, e non in 4.5, allora devi semplicemente dichiarare il delegato così se non sbaglio:

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); this.Dispatcher.Invoke(new Action(() => { this.Box_distanza.Text = "Ciao Mondo!"; })); }


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

_Andreino10 Profilo | Newbie

OK funziona grazie mille
Scusa se ti ho fatto perdere tanto tempo!
Imparerò meglio anche io spero! Grazie ancora :D

0v3rCl0ck Profilo | Guru

bene sono contento, alla prossima!


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
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