| C# listViewの画像除去・追加・挿入 |
listViewの画像除去・追加・挿入について確認しました。除去・追加は簡単に確認出来ましたが、挿入は思った様な動きをせず、試行錯誤の末に力技で再表示させることとなりました。
| 画像除去・追加・挿入プログラム |
画像除去・追加・挿入のテストプログラムを作成し、動作確認しました。
(1)起動直後
指定フォルダー画像をサムネイル化し、imageList1に画像登録し、listView1の登録項目とインデックス番号で紐付けし画像を表示します。下図のlistView1(左)の登録画像表示と右側のlistBox1に表示したlistView1のプロパティ情報表示の順番は一致しています。

(2)除去処理
テキストボックスに除去する画像の表示位置を入力し、除去ボタンをクリックすると画像が削除されます。下図の例では(2)の位置にある画像が除去されますので、2回処理を実行するとNo〔2〕とNo〔3〕のデータが除去されます。除去後の登録画像表示とlistView1のプロパティ情報の表示順番は一致しています。

(3)追加処理
追加処理は、テキストボックスに追加画像番号を入力し、追加ボタンをクリックすると対象画像を最後尾に追加します。下図例ではNo〔2〕とNo〔7〕の画像を最後尾に追加します。追加後の登録画像表示とlistView1のプロパティ情報の表示順は一致しています。

(4)挿入処理
挿入処理は指定位置に指定画像を挿入することを意図したものです。下図の例では、(2)位置にNo〔5〕の画像を挿入したいのですが、画像は最後尾に追加されています。一方、listView1のプロパティ情報の表示順は意図した通りに適切に挿入されています。
Refresh() による再描画、sorting プロパティを設定しましたが効果はありません。(sorting プロパティはそもそもTEXTに対して処理するものでした。)

| listView挿入処理時の再表示 |
他に良い方法が見つからなかったので、listViewを再表示することにしました。前にも書いた通り、挿入処理時は画像は最後尾に追加されますが、リスト項目データは意図した通り挿入されていることを確認しました。このリスト項目データを元に listViewを再表示します。
下記は全テストプログラムです。再表示は行番88~98でリスト項目データを取得し、行番100~108で一旦 listViewをクリア後、改めてリスト項目を登録しています。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace ListViewTest
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void Form3_Load(object sender, EventArgs e)
{
listView1.LargeImageList = imageList1;
get_pic_thumbnail();
chk_listView1(0);
}
private void get_pic_thumbnail()
{
listView1.Clear();
imageList1.Images.Clear();
string imageDir = @"";
string[] jpgFiles = System.IO.Directory.GetFiles(imageDir, "*.PNG");
int width = 80;
int height = 80;
imageList1.ImageSize = new Size(width, height);
listView1.LargeImageList = imageList1;
// imageList , listView 登録
for (int i = 0; i < jpgFiles.Length; i++)
{
String F_Name = Path.GetFileName(jpgFiles[i]);
Image original = Bitmap.FromFile(jpgFiles[i]);
Image thumbnail = createThumbnail(original, width, height);
imageList1.Images.Add(F_Name, thumbnail);
//imageList1.Images.Add(thumbnail);
listView1.Items.Add(F_Name, i);
original.Dispose();
thumbnail.Dispose();
}
}
// 幅w、高さhのImageオブジェクトを作成
Image createThumbnail(Image image, int w, int h)
{
Bitmap canvas = new Bitmap(w, h);
Graphics g = Graphics.FromImage(canvas);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h);
float fw = (float)w / (float)image.Width;
float fh = (float)h / (float)image.Height;
float scale = Math.Min(fw, fh);
fw = image.Width * scale;
fh = image.Height * scale;
g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh);
g.Dispose();
return canvas;
}
private void chk_listView1(int kbn)
{
listBox1.Items.Clear();
// リストビュー1(listView1)プロパティ
int listViewCnt1 = listView1.Items.Count;
string[,] dat_vw1 = new string[listViewCnt1, 4];
for (int i = 0; i < listViewCnt1; i++)
{
dat_vw1[i, 0] = listView1.Items[i].Index.ToString();
dat_vw1[i, 1] = listView1.Items[i].Text;
dat_vw1[i, 2] = listView1.Items[i].ImageIndex.ToString();
dat_vw1[i, 3] = listView1.Items[i].ImageKey;
listBox1.Items.Add(dat_vw1[i, 0] + " , " + dat_vw1[i, 1] + " , " + dat_vw1[i, 2] + " , " + dat_vw1[i, 3]);
}
// listViewを一旦初期化し再表示する
if (kbn == 1) {
listView1.Clear();
for (int i = 0; i < dat_vw1.GetLength(0); i++)
{
listView1.Items.Add(dat_vw1[i, 1], int.Parse(dat_vw1[i, 2]));
}
}
}
// 除去(削除)
private void Button1_Click(object sender, EventArgs e)
{
int tmp = int.Parse(textBox1.Text.Trim()) - 1 ;
listView1.Items.RemoveAt(tmp);
chk_listView1(0);
}
// 再読込
private void Button2_Click(object sender, EventArgs e)
{
get_pic_thumbnail();
chk_listView1(0);
}
// 追加
private void Button3_Click(object sender, EventArgs e)
{
int tmp = int.Parse(textBox2.Text.Trim()) - 1;
listView1.Items.Add(imageList1.Images.Keys[tmp], tmp);
chk_listView1(0);
}
// 挿入
private void Button4_Click(object sender, EventArgs e)
{
int tmp1 = int.Parse(textBox3.Text.Trim()) - 1;
int tmp2 = int.Parse(textBox4.Text.Trim()) - 1;
listView1.Items.Insert(tmp2, imageList1.Images.Keys[tmp1], tmp1);
chk_listView1(1);
}
}
}
下図の通り、とりあえず意図した挿入結果を得ることは出来ました。

| 参考サイトなど |
今回の listView画像除去・追加・挿入機能を使って、画像配置を変更するプログラムを検討する予定です。
参考としたサイトを幾つか挙げておきます。
①ImageList.ImageCollection.Add メソッド
②ListView.ListViewItemCollection.Add メソッド
③ListView.ListViewItemCollection.Insert メソッド
④方法 : Windows フォーム ListView コントロールで項目を追加および削除する
⑤ListViewコントロールでサムネイル画像を一覧表示するには?