【C#】ListViewの項目を別のListViewへ追加する
おはようございます。
今回は ListViewに表示したフォルダ、ファイルを別の ListView に移す(コピー)してみたいと思います。
プログラムは前回のものを流用します。
スポンサーリンク
画面修正
「追加」、「削除」、「追加項目をクリア」ボタンと、別のListViewを追加します。
ボタンにはそれぞれ「Click」イベントを追加。
プログラム修正
既存処理の修正
起動時の処理時に、追加したListViewのイメージリスト、ヘッダーを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | /// <summary> /// 起動時の処理 /// </summary> publicForm1() { InitializeComponent(); // イメージリストの設定 SHFILEINFO shFileInfo=newSHFILEINFO(); IntPtr imageListHandle=SHGetFileInfo(String.Empty,0,outshFileInfo,(uint)Marshal.SizeOf(shFileInfo),SHGFI_SMALLICON|SHGFI_SYSICONINDEX); // TreeView SendMessage(treeView1.Handle,TVM_SETIMAGELIST,newIntPtr(TVSIL_NORMAL),imageListHandle); // ListViewFrom SendMessage(listView1.Handle,LVM_SETIMAGELIST,newIntPtr(LVSIL_SMALL),imageListHandle); // ListViewTo SendMessage(listViewTo.Handle,LVM_SETIMAGELIST,newIntPtr(LVSIL_SMALL),imageListHandle); // ドライブ一覧を走査してツリーに追加 foreach(Stringdrive inEnvironment.GetLogicalDrives()) { // アイコンの取得 inticonIndex=0; IntPtr hSuccess=SHGetFileInfo(drive,0,outshFileInfo,(uint)Marshal.SizeOf(shFileInfo),SHGFI_SYSICONINDEX); if(hSuccess!=IntPtr.Zero) { iconIndex=shFileInfo.iIcon; } // 新規ノード作成 // プラスボタンを表示するため空のノードを追加しておく TreeNode node=newTreeNode(drive,iconIndex,iconIndex); node.Nodes.Add(newTreeNode()); treeView1.Nodes.Add(node); } // 初期選択ドライブの内容を表示 setListItem(Environment.GetLogicalDrives().First()); // リストビューのヘッダーを設定 listViewTo.View=View.Details; listViewTo.Clear(); listViewTo.Columns.Add("名前"); listViewTo.Columns.Add("種類"); listViewTo.Columns.Add("更新日時"); listViewTo.Columns.Add("サイズ"); } |
また、追加する項目が既に別のListViewに存在するかどうかチェックするため
ファイル・フォルダのフルパスをListViewItemに持たせるように修正します。
(リストビューの項目設定処理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | /// <summary> /// リストビューの項目を設定します. /// </summary> privatevoidsetListItem(StringfilePath) { // リストビューのヘッダーを設定 listView1.View=View.Details; listView1.Clear(); listView1.Columns.Add("名前"); listView1.Columns.Add("種類"); listView1.Columns.Add("更新日時"); listView1.Columns.Add("サイズ"); try { // フォルダ一覧 DirectoryInfo dirList=newDirectoryInfo(filePath); foreach(DirectoryInfo di indirList.GetDirectories()) { ListViewItem item=newListViewItem(di.Name); // フォルダ種類、アイコンの取得 Stringtype=""; inticonIndex=0; SHFILEINFO shFileInfo=newSHFILEINFO(); IntPtr hSuccess=SHGetFileInfo(di.FullName,0,outshFileInfo,(uint)Marshal.SizeOf(shFileInfo),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SMALLICON|SHGFI_SYSICONINDEX|SHGFI_TYPENAME); if(hSuccess!=IntPtr.Zero) { type=shFileInfo.szTypeName; iconIndex=shFileInfo.iIcon; } // 各列の内容を設定 item.Name=di.FullName; item.ImageIndex=iconIndex; item.SubItems.Add(type); item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}",di.LastAccessTime)); item.SubItems.Add(""); // リストに追加 listView1.Items.Add(item); } // ファイル一覧 List<String>files=Directory.GetFiles(filePath).ToList<String>(); foreach(Stringfile infiles) { FileInfo info=newFileInfo(file); ListViewItem item=newListViewItem(info.Name); // ファイル種類、アイコンの取得 Stringtype=""; inticonIndex=0; SHFILEINFO shinfo=newSHFILEINFO(); IntPtr hSuccess=SHGetFileInfo(info.FullName,0,outshinfo,(uint)Marshal.SizeOf(shinfo),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SMALLICON|SHGFI_SYSICONINDEX|SHGFI_TYPENAME); if(hSuccess!=IntPtr.Zero) { type=shinfo.szTypeName; iconIndex=shinfo.iIcon; } // 各列の内容を設定 item.Name=info.FullName; item.ImageIndex=iconIndex; item.SubItems.Add(type); item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}",info.LastAccessTime)); item.SubItems.Add(getFileSize(info.Length)); listView1.Items.Add(item); } } catch(IOException ie) { MessageBox.Show(ie.Message,"選択エラー"); } // 列幅を自動調整 listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } |
イベント処理の追加
各ボタンのクリックイベントを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /// <summary> /// 追加ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbtn_add_Click(objectsender,EventArgse) { varselectedItems=listView1.SelectedItems; foreach(ListViewItem item inselectedItems) { // 項目をコピーして名前を再設定 ListViewItem copy=(ListViewItem)item.Clone(); copy.Name=item.Name; // 既にリストに含まれていないパスであれば追加 if(listViewTo.Items.Find(copy.Name,false).Length==0) { listViewTo.Items.Add(copy); } } // 列幅を自動調整 listViewTo.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } /// <summary> /// 削除ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbtn_del_Click(objectsender,EventArgse) { varselectedItems=listViewTo.SelectedItems; foreach(ListViewItem item inselectedItems) { listViewTo.Items.Remove(item); } // 列幅を自動調整 listViewTo.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } /// <summary> /// 追加項目をクリアボタンクリックイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbtnClear_Click(objectsender,EventArgse) { listViewTo.Items.Clear(); } |
起動してみる
選択した項目を別の ListView に追加することができました。
まとめ
複数のフォルダやファイルに対して何か処理をする際に、ユーザに選ばせるようなイメージですね。
まあよくある感じですか。
次回は選択されたフォルダ・ファイルに対して何かしらの処理をする、などをやってみようかと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません