- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
几天前我一直在从其他线程寻找 BindingList Invoke,但无法在 vb.net 中获得合适的解决方案,其中大部分是在 C# 中,但我发现很难理解。因此我创建了一个小型应用程序,它有 2 个窗体(Form1 和 Form2)和一个类,Form1 将作为主 UI 线程,而 Form2 将在不同的线程上运行。
Form1 有一个 DataGrindView 绑定(bind)到共享的 BindingList(of T) 和一个 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 上的按钮就会抛出异常: .
任何人都可以建议我应该在哪里调用或委托(delegate),非常感谢示例 VB.net
最佳答案
这是导致问题的 DataGridView 的更新。
从您的评论中我可以看出这是因为 DataGridView 绑定(bind)到 DataGridView 的数据源,因此如果您在单独的线程上执行此操作,则更新此列表将导致跨线程操作。
一个解决方案是不公开 ListOfNames
并使用新方法允许添加到此列表:
Private Shared ListOfNames As BindingList(Of Names) = New BindingList(Of Names)
Public Sub AddNameToList(newNames As Names)
DataGridView1.BeginInvoke(Sub() ListOfNames.Add(newNames))
End Sub
关于c# - 从不同线程 vb.net 更新 BindingList(of T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38398101/
我有一个事件的绑定(bind)列表,每个事件都有一个 BuyOrders 的绑定(bind)列表 bindingListActivty.Select(k => k._dataGridViewId ==
是否可以将我的类的属性名称映射到 UltraGrid 控件的列名称? MyClass 是例如一个用户类: class User { public int Id { get; set;
基本上我有一个具有以下签名的方法: public void Save(BindingList items); 我正在尝试使用 调用它 classInstance.Save(items); //item
我有一个看似简单的问题,我希望协调两个列表,以便“旧”主列表由包含更新元素的"new"列表更新。元素由键属性表示。这些是我的要求: 仅当任何属性发生更改时,任一列表中具有相同键的所有元素都会导致将"n
有没有一种简单的方法来创建一个 BindingList 包装器(带投影),它会随着原始列表的更新而更新? 例如,假设我有一个可变的数字列表,我想在 ComboBox 中将它们表示为十六进制字符串。使用
我已经填写了绑定(bind)列表 所以我想尽快清除它 所以我有至少有 2000 项的绑定(bind)列表 什么是最好的方法? 最佳答案 你应该使用: myBindingList.Clear() 如 t
将数组转换为 BindingList 的最简单和最快的方法是什么? 最佳答案 使用 BindingList采用 IList 的构造函数. var binding = new BindingList(m
我一直在尝试寻找问题的可能原因,但似乎找不到: 错误: System.NotSupportedException: Collection is read-only. at System.ThrowHe
我不明白如何克隆 BindingList . 我想创建一个不共享相同引用的现有列表的新副本。另一个复杂情况是我的对象本身包含一个嵌套的 BindingList . 我尝试了构造函数方法: Bindin
myGenericList.RemoveAll(x => (x.StudentName == "bad student")); 效果很好,但绑定(bind)列表没有此方法。如何为绑定(bind)列表创
我的类有一个 BindingList,我想在其中使用它的属性填充 ComboBox,这样当我的列表更改时,ComboBox 也会更改。 public class UserAccess { pu
复制 BindingList 的最佳方法是什么? 只使用 ForEach()?或者有更好的方法吗? 最佳答案 BindingList 有一个可以接受 IList 的构造函数。而 BindingList
我正在尝试了解更多有关 BindingList 的信息,因为我相信它会对我正在进行的项目有所帮助。 目前,我有一个对象类 (ScannedImage),它是类 (HashedImage) 的子类型,该
我有一个绑定(bind)到 BindingList 的 DevExpress GridControl。我使用了 BindingList,以便更改自动应用到绑定(bind)控件。 当我从列表中添加或删除
我有一个 C# WinForms 应用程序,其中包含一个 BindingList,其中填充了像这样的小部件对象: BindingList widgetsList = new BindingList()
有没有办法强制 BindingList 排序(在单元测试中)?根据documentation ,方法 ApplySortCore 被标记为 protected ,但绑定(bind)控件必须通过某种方式
我正在使用 BindingList填充一些控件。 在表单的一部分,我需要使用存储在 BindingList 中的一些数据创建和排列。假设我有 BindingList并想检索所有 CEmployee.S
BindingList有没有去除重复元素的方案?我试过: BindingList accounts = new BindingList(); accounts.add(new Account("u
刚学C#/.NET就遇到了这个问题。 所以在我的解决方案中,我有 2 个项目:winforms UI 和带有逻辑的 dll。在 dll 中,我有 BindingList,它为 UI 中的列表框提供数据
我有一个异步 BindingList,其中包含在工作线程上操作并绑定(bind)到主 UI 线程上的 BindingSource 以及绑定(bind)到 DataGridView 的 BindingS
我是一名优秀的程序员,十分优秀!