none
为什么在SerialPort1的DataReceived事件中无法修改其他窗体中的控件? RRS feed

  • 问题

  • 小弟刚开始学vb.net,现在wince上写个程序,但是在datareceive事件中无法修改子窗体上控件的属性,已经用委托来调用了,不知是调用的不对还是怎么着,请大神指导,万谢

    我是在vs2005上写的,在wince5.0上运行,.net 2.0

    以下是manform中的程序,读数据部分略去了,直接上调用这,serialPort1在mainform上,接收到数据后调用form6中的qwe()

    Public Class MainForm

        Public readData(100) As Byte

        Public Delegate Sub CallForm()

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Me.Invoke(New CallForm(AddressOf ReadReceive)) End Sub Public Sub ReadReceive() Form6.qwe() End Sub End Class

    以下是form6中的程序

    Public Class Form6
         Sub qwe()
            Me.TextBox1.Text = MainForm.readData.ToString
            MainForm.StatusBar1.Text = "通道" & MainForm.readData(1) & "查询成功"
        End Sub
    End Class

    现在是statusbar1可以正常显示,但是textbox则一点反应都没有,无奈


    • 已编辑 Job Yang 2014年10月21日 3:02
    2014年10月21日 3:01

答案

  • 你好:

    DataReceived事件是在单独的线程上执行的,Winform程序中主线程以外的其他线程如果想访问主线程中的一些控件(按钮,文本框等,StatusBar是可以直接访问的)必须作一些特殊的操作,默认情况下是不允许的,这个是为了安全性考虑。解决办法是使用委托来调用控件的Text等属性进行赋值,或者使用Backgroudworker来替代一般性的Thread类。你的情况使用委托就可以了,代码请参考MSDN上的示例,里面很清楚地告诉你原因以及解决方法:

    如何:对 Windows 窗体控件进行线程安全调用


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月22日 8:00
    版主