【发布时间】:2016-07-15 14:03:43
【问题描述】:
几天前我一直在从其他线程中寻找 BindingList Invoke,但无法在 vb.net 中获得适当的解决方案,其中大部分都在 C# 中,但我发现很难理解。 因此我创建了一个小应用程序,它有 2 个表单(Form1 和 Form2)和一个类,Form1 将是主 UI 线程,而 Form2 将在不同的线程上运行。
Form1 有一个绑定到共享 BindingList(of T) 的 DataGrindView 和一个 Button,一旦单击 Button,Form2 将被加载到不同的线程上。
这是 Form1 代码:
Imports System.ComponentModel
Imports System.Threading
Public Class Form1
Public Shared ListOfNames As BindingList(Of Names) = New BindingList(Of Names)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = ListOfNames
DataGridView1.Columns("FullName").DataPropertyName = "FullName"
End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Dim thread As Threading.Thread = New Threading.Thread(AddressOf loadQuoteForm)
thread.SetApartmentState((ApartmentState.STA))
thread.Start()
End Sub
Private Sub loadQuoteForm()
Dim SecondForm As Form2 = New Form2
Application.Run(SecondForm)
End Sub
End Class
Form2 只有一个按钮,点击后会创建一个 Names 类实例,更改它的一个属性并尝试添加到 Form1.BindingList(of T)。
这是 Form2 代码:
Public Class Form2
Private Sub btnTestFromDiffTread_Click(sender As Object, e As EventArgs) Handles btnTestFromDiffTread.Click
Try
Dim myName As Names = New Names
myName.FullName = "John Peter"
Form1.ListOfNames.Add(myName)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
End Class
Imports System.ComponentModel
Public Class Names
Implements System.ComponentModel.INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _fullName As String
Public Property FullName() As String
Get
Return _fullName
End Get
Set(ByVal value As String)
_fullName = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("FullName"))
End Set
End Property
End Class
但正如您可能已经猜到的那样,只要单击 Form2 上的按钮就会引发异常: .
任何人都可以建议我应该在哪里调用或委托,非常感谢示例 VB.net 代码
【问题讨论】:
标签: c# vb.net multithreading bindinglist