ドラッグ&ドロップで画像のパス取得
画像をドラッグ&ドロップして、画面上に表示したい。
そんな要望もあるのではないかと思います。
C#で実装する場合、ドラッグ&ドロップのイベントを実装する必要があります。
そのまえに、フォーム・ドラッグ&ドロップするコントロールの
AllowDropプロパティをTrueにしておくことを忘れないようにしましょう。
それではコードの紹介です。
今回は、datagridviewの中にドラッグ&ドロップします。
private void dgItemImage_DragDrop(object sender, DragEventArgs e) { // data nothing then through if (!ev.Data.GetDataPresent(DataFormats.FileDrop)) return; AddDropImage(sender as UI.DatagridviewBase, e); } /// <summary> /// ドラッグアンドドロップされたアイテムをプレビュー表示する。 /// </summary> private void AddDropImage(UI.DatagridviewBase dg,DragEventArgs ev) { // 渡されたファイルに対して処理を行う foreach (var filePath in (string[])ev.Data.GetData(DataFormats.FileDrop)) { var ext = System.IO.Path.GetExtension(filePath); //拡張子を取得して、jpg,png,gifのみに絞る if (ext != ".jpg" && ext != ".png" && ext != ".gif") return; //重複チェックをして、行追加 var flg = false; foreach (DataGridViewRow dr in dg.Rows) { if (filePath == dr.Cells["ImagePath"].Value.ToString()) { //既に同じものが存在する場合はループを抜ける flg = true; break; } } //重複が無い場合 if (!flg) { //行追加 dg.Rows.Add(); var row = dg.Rows[dg.Rows.Count - 1]; using (var bmp = new Bitmap(filePath)) { //行の高さにあわせて幅設定 var w = (int)(bmp.Width * ((double)dg.RowTemplate.Height / bmp.Height)); int h = dg.RowTemplate.Height; Bitmap dest = new Bitmap(w, h); using (var g = Graphics.FromImage(dest)) { //画像の作成 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.DrawImage(bmp, 0, 0, w, h); row.Cells["ImagePath"].Value = filePath; row.Cells["FileName"].Value = System.IO.Path.GetFileName(filePath); //作成した画像を表示(ImageCellにしておく) row.Cells["Image"].Value = dest; } } } } }
まず最初のメソッド、dgItemImage_DragDropはイベント発生時のメソッドです。
ファイルがドロップされたときのみ対象とします。フォルダがドロップされたときは無視です。
次のAddDropImageでdatagridviewにimage込みの行を追加しています。
ドロップされたファイルのパスはforeach内の
foreach (var filePath in (string[])ev.Data.GetData(DataFormats.FileDrop))
でファイルパスに変換しています。
まず、ループで同じファイルパスの画像が存在しないことを確認します。
新規であることを確認したら、新規行追加を行い、
ファイルパスからimageを作成します。
作成したimageを対象のセルに表示しています。
意外と簡単に作れてしまいます。
ドラッグ&ドロップはユーザからすれば、ファイルダイアログでファイルを選択するよりも
簡単なので、結構需要はありそうです。
この記事へのコメントはこちら