当我在.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,ImageHorizontalAlignment,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实例,甚至尝试将其保存在磁盘上时,它可以正常工作。
第二个问题:在我将ImageList的值传递给Grid控件之前,我创建了一个新的ImageList实例,并将所有图像从ImageList(ImageManager)复制到该实例(DeepCopy)。当我制作DeepCopy并将新图像添加到新的ImageList时,它也可以正常工作。这是为什么?它为什么有效?