DevExpress GridView FocusedRow事件PictureEdit显示旧图像问题求助
解决GridView切换焦点行时PictureEdit残留上一行图像的问题
问题原因分析
你的代码存在两个核心问题:
- 仅当
filePath1不为空时才更新PictureEdit,若新焦点行的filePath1为空,PictureEdit1会保留上一行的图像;同理,filePath2为空时PictureEdit2也不会清空 - 未正确处理图像资源的释放,可能导致图像被锁定或内存泄漏
修复方案
修改FocusedRowChanged事件处理代码,确保每次切换行时先清空图像,再根据当前行数据更新,同时正确释放旧图像资源:
Private Sub GridView1_FocusedRowChanged(sender As Object, e As FocusedRowChangedEventArgs) Handles GridView1.FocusedRowChanged Dim view As GridView = TryCast(sender, GridView) If view.FocusedRowHandle = GridControl.AutoFilterRowHandle Then ' 切换到自动筛选行时清空所有PictureEdit PictureEdit1.Image?.Dispose() PictureEdit1.Image = Nothing PictureEdit2.Image?.Dispose() PictureEdit2.Image = Nothing Return End If ' 先清空旧图像,避免残留 PictureEdit1.Image?.Dispose() PictureEdit1.Image = Nothing PictureEdit2.Image?.Dispose() PictureEdit2.Image = Nothing Dim SUBFOLDERP As String = view.GetFocusedRowCellValue("SUBFOLDERP")?.ToString Dim Filename1 As String = view.GetFocusedRowCellValue("FILENAME1")?.ToString Dim Filename2 As String = view.GetFocusedRowCellValue("FILENAME2")?.ToString parentpathimage = Directory.GetCurrentDirectory() ' 处理第一个图片 If Not String.IsNullOrWhiteSpace(SUBFOLDERP) AndAlso Not String.IsNullOrWhiteSpace(Filename1) Then Dim filePath1 = DevExpress.Utils.FilesHelper.FindingFileName(parentpathimage & "\\" & SUBFOLDERP & "\\", Filename1, False) If Not String.IsNullOrWhiteSpace(filePath1) AndAlso File.Exists(filePath1) Then Try Using fs As New FileStream(filePath1, FileMode.Open, FileAccess.Read) PictureEdit1.Image = Image.FromStream(fs, True, False) End Using Catch ex As Exception ' 捕获文件读取异常,比如文件损坏、权限问题 PictureEdit1.Image = Nothing End Try End If End If ' 单独处理第二个图片,不依赖第一个图片的状态 If Not String.IsNullOrWhiteSpace(SUBFOLDERP) AndAlso Not String.IsNullOrWhiteSpace(Filename2) Then Dim filePath2 = DevExpress.Utils.FilesHelper.FindingFileName(parentpathimage & "\\" & SUBFOLDERP & "\\", Filename2, False) If Not String.IsNullOrWhiteSpace(filePath2) AndAlso File.Exists(filePath2) Then Try Using fs As New FileStream(filePath2, FileMode.Open, FileAccess.Read) PictureEdit2.Image = Image.FromStream(fs, True, False) End Using Catch ex As Exception PictureEdit2.Image = Nothing End Try End If End If End Sub
关键改动说明
- 提前清空图像:每次切换行时先释放旧图像资源并设置为
Nothing,确保不会残留上一行内容 - 独立处理两个图片:不再将PictureEdit2的更新依赖于PictureEdit1的状态,即使第一个图片不存在,第二个图片也能正常更新或清空
- 使用
Using语句管理流:避免文件被锁定,同时自动释放流资源 - 增加异常捕获:处理文件读取失败的情况,防止程序崩溃
- 增加空值前置判断:先检查
SUBFOLDERP和文件名是否为空,避免无效的路径拼接
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

