当我在 .NET 中使用 ImageList 时,我很困惑。首先,我有一个包含三个不同 ImageList 的全局对象 (ImageManager):
smallImages
(尺寸:16x16)- 包含 50 张图片(从 Designer 添加)largeImages
(尺寸:48x48) - 包含 0 张图片gridImages
(尺寸:16x16) - 包含 17 张图片(从 Designer 添加)
ImageManager 在启动时初始化一次。gridImages
用于网格控件 (JanusGridEx) 并按值传递。在运行时(在网格控件中),我将三个新图像添加到gridImages
. 我试图以三种不同的方式添加它:
- 第一次尝试
Dim ImageBuffer As Byte() = CType(DataRow(pColumnImageName), Byte()) gridImages.Images.Add(imageKey, New Icon(New MemoryStream(ImageBuffer)))
- 第二次尝试
Dim ImageBuffer As Byte() = CType(DataRow(pColumnImageName), Byte()) Dim newImage As Image = Image.FromStream(New MemoryStream(ImageBuffer)) gridImages.Images.Add(newImage)
- 第三次尝试(我认为这是最好的方法 - 如果我错了,请纠正我)
Dim ImageBuffer As Byte() = CType(DataRow(pColumnImageName), Byte()) Using ms As New MemoryStream(ImageBuffer , 0, ImageBuffer.Length) gridImages.Images.Add(imageKey, Image.FromStream(ms)) End Using
现在的问题是,当最后一张图片被添加到其中时gridImages
,我想要 ie。通过使用 imageKey 或索引获取最后一个图像(gridImages.Images(20))
我收到异常:System.ArgumentException: Parameter is not valid.
callstack:
System.ArgumentException:参数无效。在 System.Drawing.Bitmap.LockBits(矩形矩形,ImageLockMode 标志,PixelFormat 格式,BitmapData bitmapData)在 System.Drawing.Bitmap.LockBits(矩形矩形,ImageLockMode 标志,PixelFormat 格式)在 System.Windows.Forms.ImageList.GetBitmap( Int32 index) at System.Windows.Forms.ImageList.ImageCollection.get_Item(Int32 index) at Janus.Windows.GridEX.Internal.JNSBB.a(Graphics , Brush , String , Image , Rectangle , ImageHorizontalAlignment , ImageVerticalAlignment , JNSDQ , Font , Boolean , Int32 , ImageList , Boolean ) 在 Janus.Windows.GridEX.EditControls.JNSAQ.a(Graphics , Int32 , Rectangle ) 在 Janus.Windows.GridEX.EditControls.JNSAQ.a(Graphics ) 在 Janus.Windows.GridEX.EditControls .JNSAQ.OnPaint(PaintEventArgs e) 在 System.Windows.Forms.Control。
第一个问题:为什么会这样?当我创建一个新的 Image 实例,甚至尝试将它保存在磁盘上时,它可以正常工作。
第二个问题:在将 ImageList 按值传递给 Grid 控件之前,我创建了一个 ImageList 的新实例并将所有图像从 ImageList (ImageManager) 复制到该实例 (DeepCopy)。当我制作 DeepCopy 并将新图像添加到新的 ImageList 时,它也可以正常工作。这是为什么?为什么它有效?