質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

C# windowsフォームアプリケーションの作成でサムネイル画像について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,793

START_

score 25

windowsフォームアプリケーションの作成で、
フォルダを選択するダイアログから指定したフォルダ内のファイルをすべてListViewに表示させるようにしているのですが、
実行結果はファイルパス名が表示されるとこまでは行けたのですが。。
一緒にそのファイルの中にある写真データをサムネイルのように、
中身の写真を表示させその写真の下にファイル名を表示させたいのですがどのようにコードを書けばいいのかわかりません。
ImageListを使って写真を格納してlistviewプロパティから表示させてみたのですが、
写真とファイルパスのそれぞれが別々の一覧で表示されてしまいました。
例えば、ImageListのコレクションメンバーに写真をダイアログで選択したファイルの画像を動的に格納できたりしませんか?

以下に現在までのコード添付します。
よろしくお願いいたします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace Page_Switch
{
    public partial class FolderDialog : UserControl
    {
        /// <summary>
        /// 開いているフォルダ名
        /// </summary>
        private string FolderName = "";
        /// <summary>
        /// フォルダ内のすべてのファイルパス
        /// </summary>
        private string files = "";

        public FolderDialog()
        {
            InitializeComponent();
        }

        /// <summary>
        /// フォルダ選択ダイアログ表示
        /// </summary>
        /// <param name="FolderName">ファイル格納先</param>
        public bool SelectFolderDialog(ref string FolderName)
        {
            bool ret = false;

            //FolderBrowserDialogクラスのインスタンスを作成
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            //上部に表示する説明テキストを指定する
            fbd.Description = "フォルダを指定してください。";
            //ルートフォルダを指定する
            //デフォルトでDesktop
            fbd.RootFolder = Environment.SpecialFolder.Desktop;
            //最初に選択するフォルダを指定する
            //RootFolder以下にあるフォルダである必要がある
            fbd.SelectedPath = @"C:\Windows";
            //ユーザーが新しいフォルダを作成できるようにする
            //デフォルトでTrue
            fbd.ShowNewFolderButton = true;

            //ダイアログを表示する
            if (fbd.ShowDialog(this) == DialogResult.OK)
            {
                //選択されたフォルダを表示する
                Console.WriteLine(fbd.SelectedPath);
                FolderName = (fbd.SelectedPath);
                ret = true;
            }
            return ret;
        }

        /// <summary>
        /// フォルダ選択ボタンクリック 処理
        /// </summary>
        /// <param name="sender">オブジェクト</param>
        /// <param name="e">イベント</param>
        private void SelectFolderBtn_Click(object sender, EventArgs e)
        {
            // ファイ選択ダイアログを呼び出して変数を使い写真を表示
            if (SelectFolderDialog(ref FolderName))
            {
                //既にデータがあれば消す
                if (FolderView.Items != null)
                {
                    FolderView.Items.Clear();
                }

                //指定ファイル以降のファイルをすべて取得する
                IEnumerable<string> files = System.IO.Directory.EnumerateFiles(FolderName, "*", System.IO.SearchOption.AllDirectories);
                //ファイルを列挙する
                foreach (string f in files)
                {
                    FolderView.Items.Add( f , ImageList.Images.Count);
                }
            }

        }

    }
}
namespace Page_Switch
{
    partial class FolderDialog
    {
        /// <summary> 
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region コンポーネント デザイナーで生成されたコード

        /// <summary> 
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("");
            System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem("");
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FolderDialog));
            this.SelectFolderBtn = new System.Windows.Forms.Button();
            this.FolderView = new System.Windows.Forms.ListView();
            this.ImageList = new System.Windows.Forms.ImageList(this.components);
            this.SuspendLayout();
            // 
            // SelectFolderBtn
            // 
            this.SelectFolderBtn.Location = new System.Drawing.Point(21, 16);
            this.SelectFolderBtn.Name = "SelectFolderBtn";
            this.SelectFolderBtn.Size = new System.Drawing.Size(89, 32);
            this.SelectFolderBtn.TabIndex = 0;
            this.SelectFolderBtn.Text = "フォルダ選択";
            this.SelectFolderBtn.UseVisualStyleBackColor = true;
            this.SelectFolderBtn.Click += new System.EventHandler(this.SelectFolderBtn_Click);
            // 
            // FolderView
            // 
            this.FolderView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.FolderView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
            listViewItem1,
            listViewItem2,
            listViewItem3,
            listViewItem4,
            listViewItem5,
            listViewItem6,
            listViewItem7});
            this.FolderView.LargeImageList = this.ImageList;
            this.FolderView.Location = new System.Drawing.Point(21, 67);
            this.FolderView.Name = "FolderView";
            this.FolderView.Size = new System.Drawing.Size(620, 285);
            this.FolderView.SmallImageList = this.ImageList;
            this.FolderView.TabIndex = 1;
            this.FolderView.UseCompatibleStateImageBehavior = false;
            // 
            // ImageList
            // 
            this.ImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ImageList.ImageStream")));
            this.ImageList.TransparentColor = System.Drawing.Color.Transparent;
            this.ImageList.Images.SetKeyName(0, "apple.jpg");
            this.ImageList.Images.SetKeyName(1, "NewYork.jpg");
            this.ImageList.Images.SetKeyName(2, "Hydrangeas.jpg");
            this.ImageList.Images.SetKeyName(3, "Jellyfish.jpg");
            this.ImageList.Images.SetKeyName(4, "Koala.jpg");
            this.ImageList.Images.SetKeyName(5, "Tulips.jpg");
            this.ImageList.Images.SetKeyName(6, "Penguins.jpg");
            this.ImageList.Images.SetKeyName(7, "Chrysanthemum.jpg");
            this.ImageList.Images.SetKeyName(8, "Desert.jpg");
            this.ImageList.Images.SetKeyName(9, "Lighthouse.jpg");
            // 
            // FolderDialog
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.FolderView);
            this.Controls.Add(this.SelectFolderBtn);
            this.Name = "FolderDialog";
            this.Size = new System.Drawing.Size(660, 366);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Button SelectFolderBtn;
        private System.Windows.Forms.ListView FolderView;
        private System.Windows.Forms.ImageList ImageList;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • alg

    2018/04/02 11:48

    「一緒にそのファイルの中にある写真データをサムネイルのような形で表示させたい」の、何がどのようにわからないのかを具体的に書かれたほうが良いかと。今のままだと、丸投げと受け取られるかもしれません。

    キャンセル

  • START_

    2018/04/02 12:23

    的確なご指導ありがとうございます!内容編集しましたのでもしよろしければ見ていただければと思います。

    キャンセル

回答 2

checkベストアンサー

+3

画像のインデクスが追加されていないからでしょう。

ListView.ListViewItemCollection.Add メソッド (String, Int32)

追加前の ImageList.Images.Count をインデクスとして使ってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 13:47

    すみません、よろしくお願いいたします。

    キャンセル

  • 2018/04/02 14:05

    今度は ImageList への追加を忘れています。

    FolderView.Items.Add(f, ImageList.Images.Count);
    の後に
    ImageList.Images.Add(Bitmap.FromFile(f));
    を書いてください。

    それと、
    EnumerateFiles(FolderName, "*",
    のように全てのファイルを読み込もうとしていますが、画像ファイル以外のものがあった時にはそれも読み込もうとして失敗します。
    "*.jpg" のように拡張子を指定するか LINQ の Where() でフィルタリングしてください。

    とりあえずこちらでは以上で表示されました。

    キャンセル

  • 2018/04/02 14:15

    できました!!!
    長いことお手数おかけしてすみませんでした。
    画像ファイルの拡張子の指定も必要なのですね。。
    とても勉強になりました。
    本当に助かりました。ありがとうございます!!

    キャンセル

+2

ここは参考になるでしょうか

http://www.atmarkit.co.jp/ait/articles/0508/12/news091.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 12:42

    コメントありがとうございます。
    こちらのサイトも試してみたのですが、サイズは変わっているのですが写真が読み込まれず、やはりパスのみ表示されてしまいます。

    キャンセル

  • 2018/04/02 13:52

    よおーし、私が本気を出してみせよう(ナンチテ

    //指定ファイル以降のファイルをすべて取得する
    IEnumerable<string> files = Directory.EnumerateFiles(FolderName, "*", System.IO.SearchOption.AllDirectories);

    imageList.Images.Clear();

    //ファイルを列挙する
    foreach (string f in files)
    {
    try
    {
    using (System.Drawing.Image myImage = Image.FromFile(f))
    {
    imageList.Images.Add(myImage);

    FolderView.Items.Add(f, imageList.Images.Count - 1);
    }
    }
    catch { }
    }

    キャンセル

  • 2018/04/02 13:54

    あ、インデント潰れてしまった、まあいいか
    Image.FromFileでファイルが画像でない場合に例外出るのを握りつぶしてるのでここは修正(あるいは見ないふり)すること

    キャンセル

  • 2018/04/02 14:18

    コメントありがとうございます!
    試してみます!
    少し前までC言語の勉強をしており、最近C#も手をつけ始めたのですがかなり苦戦しております。。
    また基礎ばかり質問するかもしれませんが、もしお時間許すのであればお手伝いしていただけると嬉しいです!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる