Avatar billede mathiash Nybegynder
14. april 2006 - 19:43 Der er 7 kommentarer og
1 løsning

Vis mappe i listview

Hej!

Jeg har brug for at få vist en mappe's filer i et ala list view, hvordan gøres det nemmest muligt?

Skal man selv loope mappen igennem og finde ikonerne til filerne? Eller findes der noget i .net frameworket til det?

Hvad er den bedste/nemmeste løsning?

Med venlig hilsen
Mathias Hansen
Avatar billede nielle Nybegynder
14. april 2006 - 22:43 #1
Et muligt bud.

        public Form1()
        {
            InitializeComponent();

            this.listView1.View = View.Details;
            this.listView1.GridLines = true;

            // Opret en kolonne til filnavnene.
            this.listView1.Columns.Add("Filnavn");

            // Opret en ImageList til ikonerne.
            ImageList ikonListe = new ImageList();
            this.listView1.SmallImageList = ikonListe;

            // Scan biblioteket for all dets filer.
            DirectoryInfo di = new DirectoryInfo(@"C:\Windows");
            FileInfo[] fiArr = di.GetFiles();
            foreach (FileInfo fi in fiArr)
            {
                // For hver fil findes dens assocerede ikon, og denne lægges i ImageList'en.
                ikonListe.Images.Add(Icon.ExtractAssociatedIcon(fi.FullName));

                // Opret et element i ListView'et, og angiv at den
                // tilhørende "lille ikon" er det netoptilføjede ikon.
                ListViewItem lvi = new ListViewItem(fi.Name, ikonListe.Images.Count-1);

                // Tilføj elemetet til ListView'et.
                this.listView1.Items.Add(lvi);
            }
        }
Avatar billede mathiash Nybegynder
14. april 2006 - 22:58 #2
Simpelthen bare perfekt, men jeg vil meget gerne have det i Large Icons istedet for Details, det var heller ikke noget problem, men ikonerne er stadig 16x16 hvordan får jeg fat i det større ikon? (48x48)
Avatar billede nielle Nybegynder
15. april 2006 - 07:58 #3
Ikonerne er nu faktisk 32x32 - det er blot LargeImageList som af en eller anden grund pr. default resizer til 16x16. Men det er der da heldigvis råd for:

        public Form1()
        {
            InitializeComponent();

            this.listView1.View = View.LargeIcon;  // Ændret
            this.listView1.GridLines = true;

            // Opret en kolonne til filnavnene.
            this.listView1.Columns.Add("Filnavn");

            // Opret en ImageList til ikonerne.
            ImageList ikonListe = new ImageList();
            this.listView1.LargeImageList = ikonListe;  // Ændret
            ikonListe.ImageSize = new Size(48, 48);  // Nyt
           
            // Scan biblioteket for all dets filer.
            DirectoryInfo di = new DirectoryInfo(@"C:\Windows");
            FileInfo[] fiArr = di.GetFiles();
            foreach (FileInfo fi in fiArr)
            {
                // For hver fil findes dens assocerede ikon, og denne lægges i ImageList'en.
                ikonListe.Images.Add(Icon.ExtractAssociatedIcon(fi.FullName));

                // Opret et element i ListView'et, og angiv at den
                // tilhørende "store ikon" er det netop tilføjede ikon.
                ListViewItem lvi = new ListViewItem(fi.Name, ikonListe.Images.Count-1);

                // Tilføj elemetet til ListView'et.
                this.listView1.Items.Add(lvi);
            }
        }
Avatar billede nielle Nybegynder
15. april 2006 - 08:00 #4
Rettelse:

ikonListe.ImageSize = new Size(32, 32);  // Passer bedre med ikonernes rigtige størrelse.

Imidlertid kan jeg ikke rigtigt finde ud af hvordan man får fat i 48x48 ikonerne.
Avatar billede nielle Nybegynder
15. april 2006 - 08:06 #5
Der er dog et andet problem: ExtractAssociatedIcon() henter ikonen ud af filen, og dette betyder at f.eks. BMP-billeder bliver repræsenteret som en nedskaleret (grim!) version af billedet i filen - ikke som en generisk BMP-ikon.

Pråv at tilføje nedenstående klasse til dit projekt:

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace e702805
{
    public class ExtractIcon
    {
        [DllImport("Shell32.dll")]
        private static extern int SHGetFileInfo
            (
            string pszPath,
            uint dwFileAttributes,
            out SHFILEINFO psfi,
            uint cbfileInfo,
            SHGFI uFlags
            );

        [StructLayout(LayoutKind.Sequential)]
        private struct SHFILEINFO
        {
            public SHFILEINFO(bool b)
            {
                hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
            }
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.LPStr, SizeConst = 80)]
            public string szTypeName;
        };

        private enum SHGFI
        {
            SmallIcon = 0x00000001,
            OpenIcon = 0x00000002,
            LargeIcon = 0x00000000,
            Icon = 0x00000100,
            DisplayName = 0x00000200,
            Typename = 0x00000400,
            SysIconIndex = 0x00004000,
            LinkOverlay = 0x00008000,
            UseFileAttributes = 0x00000010
        }

        /// <summary>
        /// Get the associated Icon for a file or application, this method always returns
        /// an icon. If the strPath is invalid or there is no idonc the default icon is returned
        /// </summary>
        /// <param name="strPath">full path to the file or directory</param>
        /// <param name="bSmall">if true, the 16x16 icon is returned otherwise the 32x32</param>
        /// <param name="bOpen">if true, and strPath is a folder, returns the 'open' icon rather than the 'closed'</param>
        /// <returns></returns>
        public static Icon GetIcon(string strPath, bool bSmall, bool bOpen)
        {
            SHFILEINFO info = new SHFILEINFO(true);
            int cbFileInfo = Marshal.SizeOf(info);
            SHGFI flags;
            if (bSmall)
                flags = SHGFI.Icon | SHGFI.SmallIcon;
            else
                flags = SHGFI.Icon | SHGFI.LargeIcon;
            if (bOpen) flags = flags | SHGFI.OpenIcon;

            SHGetFileInfo(strPath, 256, out info, (uint) cbFileInfo, flags);
            return Icon.FromHandle(info.hIcon);
        }
    }
}

(Kilde: http://blogs.prenia.com/cathi/PermaLink.aspx?guid=64613f2c-988e-4eb3-939b-e2d9699d3282)

Derefter kan du få fat i nogle lidt pænere ikoner (men stadig 32x32) på denne måde:

        public Form1()
        {
            InitializeComponent();

            this.listView1.View = View.LargeIcon;  // Ændret
            this.listView1.GridLines = true;

            // Opret en kolonne til filnavnene.
            this.listView1.Columns.Add("Filnavn");

            // Opret en ImageList til ikonerne.
            ImageList ikonListe = new ImageList();
            this.listView1.LargeImageList = ikonListe;  // Ændret
            ikonListe.ImageSize = new Size(32, 32);  // Nyt
           
            // Scan biblioteket for all dets filer.
            DirectoryInfo di = new DirectoryInfo(@"C:\Windows");
            FileInfo[] fiArr = di.GetFiles();
            foreach (FileInfo fi in fiArr)
            {
                // For hver fil findes dens assocerede ikon, og denne lægges i ImageList'en.
                // Icon ikon = Icon.ExtractAssociatedIcon(fi.FullName);
                Icon ikon = ExtractIcon.GetIcon(fi.FullName, false, false);
                ikonListe.Images.Add(ikon);

                // Opret et element i ListView'et, og angiv at den
                // tilhørende "store ikon" er det netop tilføjede ikon.
                ListViewItem lvi = new ListViewItem(fi.Name, ikonListe.Images.Count-1);

                // Tilføj elemetet til ListView'et.
                this.listView1.Items.Add(lvi);
            }
        }
Avatar billede nielle Nybegynder
15. april 2006 - 08:47 #6
Ovenstående klasse wrapper SHGetFileInfo() funktionen fra Shell32.dll. Denne giver enten 16x16 eller 32x32 ikoner tilbage. Den kan tilsyneladende ikke give 48x48 ikonerne. Umiddelbart har jeg ikke kunne finde andre, men de findes med garanti.

Mere om SHGetFileInfo:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfileinfo.asp

Mere om ikoner:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_icons.asp
Avatar billede mathiash Nybegynder
15. april 2006 - 11:33 #7
Simpelthen perfekt, læg et svar.
Avatar billede nielle Nybegynder
15. april 2006 - 11:45 #8
Oki :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester