[vb.net]解决 "在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级"

来源:互联网 发布:腾讯nba直播大数据 编辑:程序博客网 时间:2024/05/13 22:18

 在一段给DATAGRID控件绑定DATATABLE对象的代码中,

加入线程的操作后提示"在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级"

 

在CSDN的论坛中找到其他人的建议"使用委托的方法,  先获取控件的控制权,在对控件进行操作就可以了"

 

思路有了,就是实施.

第一步,声明委托和实例话委托

 Private Delegate Sub BindDataGridDelegate()        ' 创建委托和委托对象
 Private myBindDataGridDelegate As BindDataGridDelegate = New BindDataGridDelegate(AddressOf selectdata)     'selectdata是包含datagrid的数据绑定的代码段

第二步,加入线程的准备

Private bindGridThread As Thread

Private Sub InvokeBindDataGrid()        '// 调用非此线程创建的控件的操作必须用 Invoke 或 BeginInvoke .否则将抛出异常
        dg_Ysinfo.Invoke(myBindDataGridDelegate, Nothing)
End Sub

Private Sub StopBindThread()
        If Not bindGridThread Is Nothing Then
            If bindGridThread.IsAlive Then
                bindGridThread.Abort()
                bindGridThread.Join()
            End If
        End If
        bindGridThread = Nothing
 End Sub

第三步,在按钮的点击事件中,调用线程进行DATAGRID的对查询结果的绑定

Private Sub btRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRun.Click
        StopBindThread()
        bindGridThread = New Thread(New ThreadStart(AddressOf InvokeBindDataGrid)) '; // 通过委托调用,合法
        bindGridThread.Start()
End Sub

 

通过以上3步操作后,最终把"在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级"的问题解决了,

测试的结果是预期想要的

 

 

 

原创粉丝点击