2012-03-27 11 views
0

Mit einem ListView, muss ich (große) Symbole für ein Array von ausführbaren Dateien anzeigen.Möglichkeiten zum Anzeigen von Exe-Icons in einem ListView

Gibt es einen Standard Weg dies zu tun/ein "Muster" (ob Design oder anders)?

Eine Falte: Diese .exes sollten NUR aus diesem ListView ausgeführt werden. Wenn eine Person über den Explorer zur EXE-Datei navigieren soll, sollte sie von dort nicht ausgeführt werden können. IOW, der Benutzer muss sich am System anmelden, bevor er das Array der Programmsymbole sieht (und was er sieht, hängt von seiner Rolle ab) *, und das ist das EINZIGE Gateway, um diese Apps auszuführen.

  • Also müssen diese App-Symbole programmgesteuert hinzugefügt werden.

Ideen?

Update:

Der Versuch, den Code zu verwenden, unten, um ein "Quick and Dirty" App zu erstellen.

Hier ist mein Code:

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

namespace ListViewWithAppIcons { 
    public partial class Form1 : Form { 
     public Form1() { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) { 
      DirectoryInfo dir = new DirectoryInfo(@"C:\SpotRun"); 
      foreach (FileInfo file in dir.GetFiles()) { 
       try { 
        this.imageList1.Images.Add(Image.FromFile(file.FullName)); 
       } catch { 
        Console.WriteLine("This is not a Duck-billed Platypus"); 
       } 
      } 
      this.listView1.View = View.LargeIcon; 
      this.imageList1.ImageSize = new Size(32, 32); 
      this.listView1.LargeImageList = this.imageList1; 
      //or 
      //this.listView1.View = View.SmallIcon; 
      //this.listView1.SmallImageList = this.imageList1; 

      for (int j = 0; j < this.imageList1.Images.Count; j++) { 
       ListViewItem item = new ListViewItem(); 
       item.ImageIndex = j; 
       this.listView1.Items.Add(item); 
      } 

     } 
    } 
} 

..und hier ist das "durch ein Werkzeug generierter Code" (nicht ich, das andere Werkzeug):

namespace ListViewWithAppIcons { 
    partial class Form1 { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) { 
      if (disposing && (components != null)) { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() { 
      this.components = new System.ComponentModel.Container(); 
      this.listView1 = new System.Windows.Forms.ListView(); 
      this.imageList1 = new System.Windows.Forms.ImageList(this.components); 
      this.SuspendLayout(); 
      // 
      // listView1 
      // 
      this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; 
      this.listView1.Location = new System.Drawing.Point(0, 0); 
      this.listView1.Name = "listView1"; 
      this.listView1.Size = new System.Drawing.Size(555, 408); 
      this.listView1.TabIndex = 0; 
      this.listView1.UseCompatibleStateImageBehavior = false; 
      // 
      // imageList1 
      // 
      this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; 
      this.imageList1.ImageSize = new System.Drawing.Size(16, 16); 
      this.imageList1.TransparentColor = System.Drawing.Color.Transparent; 
      // 
      // Form1 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(555, 408); 
      this.Controls.Add(this.listView1); 
      this.Name = "Form1"; 
      this.Text = "Form1"; 
      this.Load += new System.EventHandler(this.Form1_Load); 
      this.ResumeLayout(false); 

     } 

     #endregion 

     private System.Windows.Forms.ListView listView1; 
     private System.Windows.Forms.ImageList imageList1; 
    } 
} 
+0

Pause in mehrere Fragen nach unten. 1. Die Listenansicht zeigt uns den Code, der nicht funktioniert. 2. Es gibt keine "Muster", um eine Listenansicht mit Zeilen zu füllen, die Symbole enthalten, die nur die Listenansicht an eine Datenquelle binden. 3. exe's nur von dieser ListView ausführbar ist eine separate Frage alle zusammen. ps Ich habe dich nicht runtergeschmissen, aber ich werde dich nicht wieder auf Null bringen. –

+0

Es würde viel mehr als eine Aufwertung brauchen, um mich wieder auf Null zu bringen, mein Freund. –

+0

Ich habe keinen Code, der nicht funktioniert, ich habe mich nur gefragt, ob das Problem bereits von klügeren Leuten gelöst wurde. Ich bin ein gutes Stück vom Weg dorthin, aber nicht überzeugt, dass mein Weg "sehr sportlich" ist (zufällige/überflüssige Princess Bride-Referenz). –

Antwort

1

Hallo Ton, ich muss referenziere eine überflüssige Prinzessin Bride!

Ein Beispiel aus MSDN so wissen Sie es Codierung süß:

private void Form_Load(object sender, EventArgs e) 
{ 
    DirectoryInfo dir = new DirectoryInfo(@"c:\pic"); 
    foreach (FileInfo file in dir.GetFiles()) 
    { 
     try 
     { 
      this.imageList1.Images.Add(Image.FromFile(file.FullName)); 
     } 
     catch 
     { 
      Console.WriteLine("This is not an image file"); 
     } 
    } 
    this.listView1.View = View.LargeIcon; 
    this.imageList1.ImageSize = new Size(32, 32); 
    this.listView1.LargeImageList = this.imageList1; 
    //or 
    //this.listView1.View = View.SmallIcon; 
    //this.listView1.SmallImageList = this.imageList1; 

    for (int j = 0; j < this.imageList1.Images.Count; j++) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.ImageIndex = j; 
     this.listView1.Items.Add(item); 
    } 
} 

Menschen zu verhindern, wenn Sie die exe öffnen (mit Ausnahme von Ihrem Programm) ist ziemlich hart, wäre es leicht, schrieb alle diese Anwendungen und könnte ein geheimes Argument (wie in einer Befehlszeile arg) benötigen, um die anderen Anwendungen zu starten. Aber mit Process Monitor/Explorer konnten Benutzer den geheimen Schlüssel herausfinden.

Alternativ können Sie die EXE in einem Ordner verstecken, aber der Trick dabei ist, dass der Name der Exe im Task Manager angezeigt wird und sobald die Benutzer sehen, dass sie nach der exe suchen können. Ich meine, du könntest das hier mit meiner Technik umgehen, aber wie tief ist das Tollpatschloch: How to hide C# application from taskmanager processtab? - siehe meine Antwort, es hat die meisten Stimmen.

Vielleicht eine bessere Lösung als das alles herumschlagen stuf von den Benutzern versteckt wäre - Kiosk-Modus: http://support.microsoft.com/kb/555463

+0

Dies hat einige nützliche Code, denke ich, aber ich nahm es und machte die einfachste App (alles was ich tat, war ein ListView und eine ImageList, änderte das Verzeichnis (zu einem, das nur zwei Dateien enthält, und fügte hinzu "using system .IO "um es kompilieren zu lassen. Bei der ersten Iteration durch die foreach-Schleife schlägt es mit einer OutOfMemoryException fehl. Es wird nicht angezeigt, wenn Sie nur die App ausführen (das ListView bleibt einfach leer), aber beim Durchlaufen wird das "catch" erreicht, und das ist die Ausnahme. –

+0

Sie können mir die Lösung und die Dateien per E-Mail senden, meine E-Mail-Adresse befindet sich in meinem Profil oder Sie geben einfach den Code ein, den wir verwenden können, um den Fehler in einer anderen Frage zu reproduzieren. Danke Clay –

+0

Ich habe mir den Kiosk-Modus angeschaut, der für bestimmte Szenarien großartig wäre, aber die Benutzer werden ihre Computer auch für "andere Sachen" brauchen - nicht nur für diese Apps. –

Verwandte Themen