You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PictureBox功能异常:签名框与照片框同步显示问题求助

解决PictureBox签名与照片重复显示的问题

嘿,我看你遇上了两个PictureBox串图的麻烦——选新签名后,签名框居然和照片框显示同一张图。咱们先从你贴的代码里揪出几个关键问题,再给你修复方案:

1. 代码里的语法错误

先把最明显的bug改了:

  • addwithvalue(“@id”,accountnumber “) 这里多了个多余的引号,正确写法是 .AddWithValue("@id", accountnumber)
  • Image viewer.image.fromstream(imgstream) 变量名写错了(Image viewer不该有空格),而且赋值逻辑不对,得写成 imageviewer.Image = Image.FromStream(imgstream)

2. MemoryStream的指针位置坑

你把字节数据写入MemoryStream后,流的指针会停在最后一位,这时候直接用Image.FromStream读,可能读不到有效数据,甚至复用了之前的图像资源。必须在读取前把流的Position重置为0。

3. 资源没正确释放

MemoryStream、SqlDataReader这些资源如果不及时释放,不仅会占内存,还可能导致图像资源被锁,间接引发显示异常。用Using语句能自动帮你释放这些资源,省心又安全。

修复后的完整代码

Public Sub GetAccountSignature(ByVal accountNumber As String, ByVal imageViewer As PictureBox)
    ' 用Using自动释放连接资源
    Using conn As New SqlConnection("你的数据库连接字符串") ' 替换成你自己的连接字符串
        conn.Open()
        conn.ChangeDatabase("Bgsale")
        
        ' 包裹SqlCommand,自动释放命令资源
        Using cmd As New SqlCommand("select signature from tblaccounts where accountnumber = @id", conn)
            cmd.Parameters.Clear()
            cmd.Parameters.AddWithValue("@id", accountNumber)
            
            ' 包裹SqlDataReader,自动释放阅读器资源
            Using rd As SqlDataReader = cmd.ExecuteReader()
                If rd.HasRows Then
                    rd.Read()
                    ' 直接把数据库里的字节数据转成数组
                    Dim imgByte As Byte() = DirectCast(rd("signature"), Byte())
                    
                    ' 用Using管理MemoryStream,避免资源泄漏
                    Using imgStream As New System.IO.MemoryStream(imgByte)
                        ' 把流指针移到开头,确保能正确读取
                        imgStream.Position = 0
                        
                        ' 先释放之前的图像资源,避免内存占用
                        If imageViewer.Image IsNot Nothing Then
                            imageViewer.Image.Dispose()
                        End If
                        
                        ' 给PictureBox赋值图像
                        imageViewer.Image = Image.FromStream(imgStream)
                    End Using
                Else
                    ' 清空图片前也要释放旧资源
                    If imageViewer.Image IsNot Nothing Then
                        imageViewer.Image.Dispose()
                    End If
                    imageViewer.Image = Nothing
                End If
            End Using
        End Using
    End Using
End Sub

额外要排查的点

如果改完代码还是串图,你得检查这几个地方:

  • 调用GetAccountSignature的时候,是不是传错了PictureBox?比如本来要传签名的PictureBox,结果不小心传成了显示照片的那个。
  • 确认数据库里的signature字段存的确实是签名的字节数据,别和照片字段的数据搞混了(可以直接查数据库验证)。
  • 检查你更新签名的代码,是不是在选择新签名后,错误地把签名数据写到了照片对应的数据库字段里?

内容的提问来源于stack exchange,提问作者Adagbon Kelvin

火山引擎 最新活动