.NET で ImageList を使用しているとき、私はとても混乱しています。まず、3 つの異なる ImageList を含むグローバル オブジェクト (ImageManager) があります。
smallImages
(サイズ: 16x16) - 50 枚の画像が含まれています (デザイナーから追加)largeImages
(サイズ: 48x48) - 0 個の画像が含まれていますgridImages
(サイズ: 16x16) - 17 枚の画像が含まれています (デザイナーから追加)
ImageManager は起動時に一度初期化されます。gridImages
グリッド コントロール (JanusGridEx) で使用され、値渡しされます。実行時 (グリッド コントロール内) に 3 つの新しいイメージを に追加していgridImages
ます。私は3つの異なる方法でそれを追加しようとしていました:
- 初挑戦
Dim ImageBuffer As Byte() = CType(DataRow(pColumnImageName), Byte()) gridImages.Images.Add(imageKey, New Icon(New MemoryStream(ImageBuffer)))
- 2 回目の試行
Dim ImageBuffer As Byte() = CType(DataRow(pColumnImageName), Byte()) Dim newImage As Image = Image.FromStream(New MemoryStream(ImageBuffer)) gridImages.Images.Add(newImage)
- 3回目の試行(これが最善の方法だと思います-間違っている場合は修正してください)
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
です。imageKey または index(gridImages.Images(20))
を使用して最後の画像を取得すると、例外が発生します: callstack System.ArgumentException: Parameter is not valid.
:
System.ArgumentException: パラメーターが無効です。System.Drawing.Bitmap.LockBits (Rectangle rect、ImageLockMode フラグ、PixelFormat 形式、BitmapData bitmapData) で System.Drawing.Bitmap.LockBits (Rectangle rect、ImageLockMode フラグ、PixelFormat 形式) で System.Windows.Forms.ImageList.GetBitmap ( 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 の新しいインスタンスを作成し、それをディスクに保存しようとしても、正しく動作します。
2 番目の質問: ImageList を値でグリッド コントロールに渡す前に、ImageList の新しいインスタンスを作成し、すべての画像を ImageList (ImageManager) からそのインスタンス (DeepCopy) にコピーします。DeepCopy を作成して新しいイメージを新しい ImageList に追加すると、正常に動作します。何故ですか?なぜ機能しているのですか?