抛出ArgumentException的ImageList的奇怪行为

时间:2013-04-23 10:08:01

标签: .net imagelist argumentexception

当我在.NET中使用ImageList时,我很困惑。首先,我有一个包含三个不同ImageLists的全局对象(ImageManager):

  • smallImages (尺寸:16x16) - 包含50张图片(从Designer中添加)
  • largeImages (大小:48x48) - 包含0张图片
  • gridImages (尺寸:16x16) - 包含17张图片(从设计师处添加)

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(Rectangle rect,ImageLockMode flags,PixelFormat format,BitmapData bitmapData)   在System.Drawing.Bitmap.LockBits(Rectangle rect,ImageLockMode标志,PixelFormat格式)   在System.Windows.Forms.ImageList.GetBitmap(Int32索引)   在System.Windows.Forms.ImageList.ImageCollection.get_Item(Int32索引)   在Janus.Windows.GridEX.Internal.JNSBB.a(Graphics,Brush,String,Image,Rectangle,ImageHorizo​​ntalAlignment,ImageVerticalAlignment,JNSDQ,Font,Boolean,Int32,ImageList,Boolean)   在Janus.Windows.GridEX.EditControls.JNSAQ.a(Graphics,Int32,Rectangle)   在Janus.Windows.GridEX.EditControls.JNSAQ.a(图形)   在Janus.Windows.GridEX.EditControls.JNSAQ.OnPaint(PaintEventArgs e)   在System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 layer)   在System.Windows.Forms.Control.WmPaint(消息& m)   在System.Windows.Forms.Control.WndProc(消息& m)   在System.Windows.Forms.ScrollableControl.WndProc(消息& m)   在System.Windows.Forms.ContainerControl.WndProc(消息& m)   在Janus.Windows.GridEX.EditControls.JNSAQ.WndProc(Message& msg)   在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)   在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)   在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,> IntPtr lparam)

第一个问题:为什么?当我创建一个新的Image实例,甚至尝试将其保存在磁盘上时,它可以正常工作。

第二个问题:在我将Im​​ageList的值传递给Grid控件之前,我创建了一个新的ImageList实例,并将所有图像从ImageList(ImageManager)复制到该实例(DeepCopy)。当我制作DeepCopy并将新图像添加到新的ImageList时,它也可以正常工作。这是为什么?它为什么有效?

0 个答案:

没有答案