You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:05:20