VB.NET中绑定不同数据源的ListBox间数据迁移方案咨询
WinForm ListBox绑定数据源后的数据迁移与同步方案
一、先替换数据源为BindingList(Of FileInfo)实现自动同步
普通的List(Of T)未实现INotifyCollectionChanged接口,修改集合后ListBox不会自动更新。换成BindingList(Of FileInfo)后,集合的增删操作会自动同步到绑定的ListBox,这是最省心的方案。
示例代码:加载图片文件夹到ListBox
' 为每个ListBox声明独立的BindingList数据源 Private sourceList1 As New BindingList(Of FileInfo)() Private sourceList2 As New BindingList(Of FileInfo)() ' 加载指定文件夹的图片到ListBox1 Private Sub LoadImageFolderToListBox1(folderPath As String) Dim dirInfo As New DirectoryInfo(folderPath) ' 定义需要过滤的图片格式 Dim validImageExts As String() = {".jpg", ".jpeg", ".png", ".bmp", ".gif"} ' 过滤出图片文件 Dim imageFiles = dirInfo.GetFiles().Where(Function(f) Return validImageExts.Contains(f.Extension.ToLower()) End Function) sourceList1.Clear() For Each file In imageFiles sourceList1.Add(file) Next ' 绑定数据源到ListBox,指定显示文件名 ListBox1.DataSource = sourceList1 ListBox1.DisplayMember = "Name" End Sub
二、ListBox间的数据迁移实现
基于BindingList的特性,直接修改数据源即可自动同步ListBox,无需手动刷新控件。
1. 移动选中的单个项
Private Sub btnMoveSelected_Click(sender As Object, e As EventArgs) Handles btnMoveSelected.Click If ListBox1.SelectedItem IsNot Nothing Then Dim selectedFile = DirectCast(ListBox1.SelectedItem, FileInfo) ' 从源集合移除,添加到目标集合 sourceList1.Remove(selectedFile) sourceList2.Add(selectedFile) End If End Sub
2. 移动全部项
Private Sub btnMoveAll_Click(sender As Object, e As EventArgs) Handles btnMoveAll.Click ' 用ToList()避免遍历过程中修改原集合引发异常 For Each file In sourceList1.ToList() sourceList1.Remove(file) sourceList2.Add(file) Next End Sub
3. 反向移动(从ListBox2到ListBox1)
逻辑与上述一致,仅需交换sourceList1和sourceList2的操作对象即可。
三、若坚持使用List(Of FileInfo)的处理方式
如果不想替换数据源类型,修改集合后需要手动重置ListBox的DataSource来触发刷新,但会丢失当前选中状态:
' 声明普通List数据源 Private sourceList1 As New List(Of FileInfo)() Private sourceList2 As New List(Of FileInfo)() ' 移动选中项示例 Private Sub btnMoveSelected_Click(sender As Object, e As EventArgs) Handles btnMoveSelected.Click If ListBox1.SelectedItem IsNot Nothing Then Dim selectedFile = DirectCast(ListBox1.SelectedItem, FileInfo) sourceList1.Remove(selectedFile) sourceList2.Add(selectedFile) ' 手动重置DataSource刷新ListBox ListBox1.DataSource = Nothing ListBox1.DataSource = sourceList1 ListBox1.DisplayMember = "Name" ListBox2.DataSource = Nothing ListBox2.DataSource = sourceList2 ListBox2.DisplayMember = "Name" End If End Sub
四、图片过滤逻辑优化
把图片格式集合抽成可维护的变量,方便后续扩展:
Private validImageExts As String() = {".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp"}
内容的提问来源于stack exchange,提问作者Irfan Azhari
相关产品推荐
相关产品推荐

