Abou Chleih

{the magic lies between the brackets}

Menü Schließen

Seite 3 von 8

Lumia Cyan Update (Windows Phone 8.1) auf dem Lumia 520 installieren

Vor einigen Tagen wurde der Status des Cyan Updates für das Lumia 520 auf der Nokia Seite auf „Avaliable“ geändert und sollte somit den Nutzern zur Verfügung stehen.
Die bisherigen Updates, auch die der Developer Preview wurden über das Windows Phone eigene Updatemenü installiert.
Allerdings fand das Lumia dieses Cyan Update einfach nicht – zumindest nicht als OTA.
Im Netz ist dieses Problem kaum beschrieben. Da aber die Versionen in Mitteleuropa alle die gleichen sind und das Update in anderen Ländern wohl ohne Probleme ausgerollt wurde, muss es entweder etwas mit dem deutschen Server zu tun haben, oder mit meinem Smartphone.
Wie bekomme ich also das Update auf mein Lumia?
Microsoft hat das sogenannte Nokia Software Recovery Tool still und heimlich veröffentlicht.
Mit diesem Tool kann man das Update dann aufspielen, aber ACHTUNG! Es werden alle Daten auf dem Gerät gelöscht. Deshalb vorher ein Backup über die Windows Phone eigene Backup-Funktion ausführen. Dieses kann man dann nach der Installation einspielen.
1. Nokia Software Recovery Tool (NSRT) herunterladen und installieren.
2. Lumia 520 mit dem Rechner über ein microUSB Kabel verbinden
3. Das NSRT starten, es erkennt dann automatisch das angeschlossene Gerät und sucht das aktuellste Update für dieses.

Nokia Software Recovery Tool Update found
4. Das Gerät muss  über mindestens 1,7GB freien Speicher verfügen (lokal, nicht auf der SD Karte)

Anschließend einfach den Anweisungen folgen. Das Update ist 1,56GB groß, d.h. der Download kann je nach Downloadgeschwindigkeit dauern.

Danach kann man das Handy neu einrichten, solltet ihr das Backup getätigt haben, so wird euch dieses bei der Ersteinrichtung angezeigt und ihr könnt es zurückspielen.

Das war’s, nun habt ihr das Lumia Cyan Update auf eurem Lumia 520.

Lumia_Cyan_520

Wieso in der Mathematik 0,(9) also 0,999999…. exakt 1 ist

Im Zuge meines Studiums bin ich mit der weniger bekannten Tatsache konfrontiert worden, dass math_992.5_3293f03d5fcefabfff40f26cba81fa27, also math_994_5a60d4a104cfbb73fb653d27f231a4b8 exakt gleich 1 ist.
Wieso?

Stellen wir uns einmal diese Zahl vor:
math_994_5a60d4a104cfbb73fb653d27f231a4b8 ist eigentlich die Summe folgender Summanden:
math_992.5_16248d0326f7c946d02d1e0365999079

Mathematisch kann man dies wie folgt darstellen:

math_986.5_ff8698b18595ded77a7f12c7a32c3d22
oder
math_971_e51f70a143516b47f49a91deb38a5f42
Definition:
math_994_aab1f016985f49f4f38239b6ca425f66

math_983_881ba45f62a37cee7193169b3be411f1
Daraus folgt (geometrische Reihe): math_980_c595caa0af46846044fd1eb9fa4e3d41

Falls es jemand nicht direkt versteht: Was sind   1/3 dezimal geschrieben?
Richtig, 0,(3) bzw. 0,3333333333333…
Jetzt multiplizieren wir diesen Wert mit (1/3) * 3 = 3/3 = 1
Aber  0,333333… * 3 = 0,999999… = 0,(9)
Dies ist zwar jetzt nicht der Beweis, aber zeigt der Person anschaulich die Problematik.

Überrascht? Das war ich auch.
Aber dies erklärte meine Frage zur Integralrechnung, wieso der Flächeninhalt – math_975.5_0d4b644471f5b3248872fc21e3e6fc59  – von t∈[1,2) <Grenzwerte: einschl. 1 bis ausschließlich 2> gleich dem Flächeninhalt von t∈[1,2] <Grenzwerte: einschl. 1 bis einschließlich 2> ist.

[Erfahrungsbericht] Metawatch Frame im Test mit dem Google Nexus 5

Da der Trend mit den Wearables ja gerade richtig anfängt, habe ich mir gedacht, ich schaue mich einmal nach einer sogenannten SmartWatch um.
Viele Namen fielen dort auf: G Watch, Moto 360, Pebble. Alle im Preisrahmen von 200€. Zuviel für einen Einstieg in die Materie und für Geräte, die ich vielleicht gar nicht richtig nutzen kann oder will.
Nach ein bisschen Recherche fand ich dann die MetaWatch, welche es in zwei Auführungen gibt: Strata und Frame.
Ich entschied mich für die edlere Frame aus Aluminium mit schwarzem Lederarband für ca. 85€.
In den letzten Tagen testete ich die Uhr.

Unboxing:

Also bestellt und ausgepackt. Die Uhr ist schlicht in der Hülle gehalten. Als Zusatz gibt es einen Ladeclip (darauf komme ich später zurück) und ein microUSB-Kabel.
20140913_113949_Android20140913_114255_Android

Daraufhin also das Kabel in den Ladeclip und an ein USB-Ladegerät hängen (nicht im Lieferumfang) und die Uhr voll laden lassen (brauch ca. 2-3 Stunden).
Da fällt schon der erste Makel auf. Der Clip bzw. der Anschluss an der Uhr sind etwas fummelig und es braucht einen Augenblick, bis die Uhr dann lädt.

Inbetriebnahme:

Währenddessen erstmal die App im PlayStore heruntergeladen.
Es gibt auch eine Community-Version der Software. Allerdings lief diese bei mir alles andere als zufriedenstellend, die Wetter Funktion ist nicht funktional, einige Screens laden sehr langsam, die Notifications erscheinen teilweise nicht und es erscheint ein Störbild.
Die Uhr blieb einige Male sogar hängen und musste hart zurückgesetzt werden. So habe ich die Community Version deinstalliert und die Uhr zurückgesetzt. (Mitte links und Mitte rechts gedrückt halten und dann an das Ladegerät hängen). Sollte man die Uhr nicht zurücksetzen, so ist das Layout komplett gestört und die Uhr funktioniert nicht.

Danach habe ich die Uhr mit der originalen Software genutzt und diese mit dem Handy verbunden.
Anschließend kann man die vier Bildschirme frei mit den zur Verfügung gestellten Widgets bestücken:

  • Uhr
  • Wetter
  • Kalender
  • Facebook
  • Aktien
  • Unread GMail
  • Batteriestatus
  • Gelaufen Schritte
  • Twitter

Screenshot_2014-09-13-11-43-51Screenshot_2014-09-15-18-09-38Screenshot_2014-09-13-11-44-51   Screenshot_2014-09-13-11-44-30Screenshot_2014-09-13-11-44-07Screenshot_2014-09-13-11-44-18

Die Widgets können in verschiedenen Größen (siehe Bild 1 und 2) hinzugefügt werden, allerdings stehen nicht alle in allen Größen zur Verfügung.
Nach der Konfiguration der Widgets kann man diese noch genauer einstellen, bspw. der Ort des WetterWidgets und die Updatehäufigkeit (siehe Bild 3)
In der Einstellungen kann man noch einstellen, über welche Dinge man informiert werden möchte und seinen Facebook bzw. Twitter Account verbinden (wird für das Widget benötigt), etc. (siehe Bilder 4 und 5).
Im MetaFilter-Menü kann man noch einstellen, von welchen Apps man Notifications erhalten möchte.

Nutzung:

Die Uhr macht am Arm eine ganz gute Figur im Vergleich zu anderen SmartWatches auf dem Markt. Dies hat sie vor allem ihrem Alu-Look und den gebürsteten Knöpfen zu verdanken.
Aber der Look ist eben Geschmackssache.
Grundsätzlich habe ich den ersten Bildschirm die Uhr als Vollscreen-Widget gebunden. So erfüllt die Uhr auch ihren wirklichen Zweck. (1)
Da Display ist glänzend und spiegelnd, was wohl an dem pixel reflective mirror LCD liegt.
Anfänglich dachte ich, dass das Display eine der Schwachenstellen des Gerätes ist. Das Display spiegelt nämlich stark, wenn man es im Licht hin- und herschwenkt.
Am Arm ist dies aber kein wirkliches Problem. Im Dunkeln kann man die Uhr lesen, indem man die LED aktiviert (Button Rechts oben).

20140913_113949_Android20140913_113821_Android20140913_113721_Android20140913_114004_Android20140915_184151_AndroidIMG_20140915_190205

Nun zu den smarten Gimmicks des Gerätes. Über den Knopf (Mitte links) lässt sich das Musik-Menü aufrufen. Hier wird das gerade gespielte Lied angezeigt. Man kann die Lautstärke ändern und zum nächsten Lied springen, aber auch das Lied pausieren und weiter spielen lassen. (2)

Über den Knopf unten links lässt sich das Infomenü auswählen, hier lässt sich der Status der Uhr abrufen, also Akkustand, Bluetooth, Verbindung zum Handy und Hardware, sowie Firmwareversion ablesen. (3)

Sollte eine Notification eingehen, so vibriert die Uhr und zeigt diese auf dem Display an (4). Nach diesem Muster werden alle Notifications für Apps angezeigt, welche man im MetaFilter gesetzt hat.
Die Facebook-Option, welche man noch setzen kann (siehe Punkt „Inbetriebnahme“) zeigt dann zusätzlich noch Benachrichtigungen an (5).

Im letzten Bild sieht man das Kalender-Widget im Vollscreen-Modus.

Die Akkulaufzeit beträgt geschätzt vier bis fünf Tage, danach muss die Uhr wieder an die Ladestation.

Fazit

Für diesen Preis erfüllt die Uhr genau das, was sie soll. Allerdings ist die App in den Widgets beschränkt und es gibt keine explizite Funktion, um bspw. WhatsApp-Nachrichten anzeigen zu lassen. Auch ist das Display, obwohl es mich nicht wirklich stört, nicht die beste Wahl für eine Uhr, welche in allen Bedingungen gut ablesbar sein soll.
Auch ist die Uhr nicht sonderlich verbreitet. Die Community-Edition wurde zuletzt 2012 aktualisiert. Auch das Forum von MetaWatch ist nicht gerade stark frequentiert.
Die App für Android wurde zuletzt im Juni 2014 aktualisiert, allerdings nur für „minor bug fixes“. Erhofft man sich also in der Zukunft mehr Funktionen, so rate ich zu einer anderen Uhr.
Ansonsten ist die Uhr für diesen Preis gut. Über das Display und den fummeligen Ladeanschluss kann man hinwegsehen.
Und wer sich mit diesen Funktionen zufrieden gibt, wird sich mit dieser Uhr anfreunden können.

Internet Explorer 8 und 11 Group Policies (GPOs, Gruppenrichtlinien) definieren

Um Benutzern in einem Unternehmen vordefinierte Regeln und Rechte einzuräumen gibt es im Active Directory die sog. Group Policy Objects (GPOs) oder zu deutsch Gruppenrichtlinien.
In diesen kann man Usereinstellungen, wie Redirects von lokalen Dateien auf ein Fileshare und Ähnliches veranlassen.
Weiterhin kann man Richtlinien für den Internet Explorer definieren. Darüber geht es hier nun heute.

Im weiteren Verlauf werden die englischen Bezeichnungen der Programme verwendet

Grundsätzlich kann man Gruppenrichtlinien über das „Group Policy Management“.
Nach dem Öffnen klickt man auf den Forest und dann auf die entsprechende Domain, für welche die GPO gelten soll.
Im Ordner „Group Policy Objects“ sind alle GPOs gespeichert. Mit einem Rechtsklick auf diesen Ordner, kann man über die Schaltfläche „New…“ eine neue GPO erstellen.
Neue GPO erstellen

Sobald wir eine GPO erstellt haben, wird diese gelistet und kann mit einem Rechtsklick -> „Edit…“ bearbeitet werden.
Nun gibt es grundsätzlich zwei Wege, wie man Berechtigungen und Einstellungen setzen kann. Einmal computerbezogen und einmal userbezogen.
Ich bevorzuge letztere Variante.

Grundsätzliche Einstellungen für den IE8 (teils veraltet):
Für den Internet Explorer 8 kann man die Einstellungen über Policies -> Administrative Templates -> Windows Compontens -> Internet Explorer definieren.
Die wichtigsten Einstellungen im Unternehmensumfeld sind wohl Restriktionen in Sachen Windows Update und Feedback, sowie Einstellungen in Sachen Proxy und Kompatibilität.
Im Punkt „Browser Menus“ kann man die Feedback Option von Microsoft deaktivieren.
Im Punkt „Internet Control Panel“ kann man die verschiedenen Reiter im Punkt „Internet Optionen“ ein- bzw. ausblenden lassen.

  • Im Unterpunkt „Advanced Page“ kann man die Windows Updates unterbinden, dazu den Punkt „Automatically check for Internet Explorer updates“ auf Disabled setzen
  • Im Unterpunkt „Security Page“ kann man nun Einstellungen für die verschiedenen Zonen im IE definieren:
    • Generell kann man aber beim Punkt „Site to Zone Assignment List“ Seite zu den verschiedenen Zonen hinzufügen.
      Es gilt: (1) Intranet , (2) Trust Site, (3) Internet, (4) Restricted Site
      Damit die Option greift, muss man den Punkt auf Enabled setzen
    • Damit die gesetzten Optionen in den entsprechenden Unterpunkten bspw. Internet Zone greifen, muss man die Punkte „XY“ Zone Template auf Enabled setzen

Erweiterte Einstellungen für den IE11 (neuer Weg):
Generell werden bei einem Update alle Einstellungen des Users auf den neuen Internet Explorer migriert.
Sollte jedoch ein Profil neu erstellt werden, so ziehen nicht mehr alle Einstellungen (im o.g. Punkt IE8). Microsoft hat hier einen neuen Punkt erstellt, welche die Einstellungen vereinfachen sollen.
Dazu einfach auf Preferences -> Control Panel Settings -> Internet Settings gehen und per Rechtsklick einen neuen Eintrag für die jeweiligen IE Version erstellen.
Der Rest sollte sich von selbst erklären 😉

gpo_pref

Windows Phone 8.1 – Project my Screen

Mit Windows Phone 8.1 ist neben den bereits genannten Funktionen eine neue Funktion namens „Project my Screen“ hinzugekommen.
Diese ermöglicht es den Bildschirminhalt des Smartphones per USB Verbindung auf den Desktop zu übertragen.

Voraussetzung dafür ist die Applikation für den Windows-PC, welche über die Microsoft-Download-Seite zu beziehen ist.

Was anfänglich irritiert ist, dass die Dekstopapplikation standardmäßig im Vollbild läuft und keinerlei Schaltflächen oder eine Maus besitzt.
Die Bedienung ist deshalb im Vollbild sehr unhandlich. Ein Druck auf die Escape, die F-Taste oder Alt-Enter lässt uns dann aber das Programm verkleinern/vergrößern.
Hier kann man dann aber auch die Maus zum Navigieren benutzen.
Über den dann sichtbaren Menüpunkt „Help“ lassen sich dann auch die Key-Shortcuts herausfinden:
Shortcuts_Project_my_Screen

Ich kann mich den Meinungen der User und der Presse hier nur anschließen.
Das Programm ist wirklich praktisch und schnell – es tritt kaum eine merkliche Verzögerung bei der Bildschirmübertragung auf (USB 2.0) .

Project_my_screen_menu

Windows Phone 8.1 – Neuerungen im Überblick

Wie bereits vielen bekannt, befindet sich Windows Phone 8.1 in der finalen Phase und wird voraussichtlich am 14.April für die Hersteller und Entwickler freigegeben.

Hier ein kleiner  Überblick über die Neuerungen:
1. Statusleiste
2. Cortana (Pendant zu Siri)
3. VPN
4. Internet Explorer 11 (mit Button zum Tabwechsel und Sync)
5. Storage Sense (Speicherverbrauchsanzeige)
6. Getrennte Lautstärke für Medien und Signale (Anrufe etc.)
7. App2SD (Apps auf Speicherkarte installieren)

Kleinere Neuerungen:
1. Man kann nun Apps auch mit einem Wisch nach unten beenden
2. Der Kalender hat nun auch eine Wochenansicht
3. Es gibt nun s.g. Ruhezeiten, also Zeiten in denen das Handy nicht schellt
4. Die Kamera-App wurde überarbeitet.
5. Mehr Tiles im Hauptmenü (6 Spalten)

[OTRS] Internet Explorer 10 – Keine Umbrüche möglich/Einfügen nicht möglich

In der OTRS Version 3.1.1 ist es mit dem Internet Explorer 10 nicht möglich Zeilenumbrüche per Enter-Taste im Textfeld einzufügen.
Wechselt man in den Dokumentenmodus des Internet Explorers 9 oder niedriger, so ist es wieder möglich Zeilenumbrüche einzufügen.

Um den Dokumentenmodus des IE9 zu erzwingen, muss man zwei Dateien des OTRS anpassen.

Beide Dateien befinden sich unter

C:\OTRS\OTRS\Kernel\Output\HTML\Standard

1. Datei: CustomerHeader.dtl

Hier muss Head der Datei die Zeile

<meta http-equiv=“X-UA-Compatible“ content=“IE=edge,chrome=1″ />

zu

<meta http-equiv=“X-UA-Compatible“ content=“IE=EmulateIE9,chrome=1″ />

geändert werden.

2. Datei: HTMLHead.dtl

In der HTMLHead.dtl-Datei muss die selbe Änderung vorgenommen werden.

Edge bedeutet dass der Internet Explorer den Dokumentenmodus mit der höchsten Version verwenden soll. EmulateIE9 erzwingt den Dokumentenmodus des Internet Explorers 9

[OTRS] Weitere Abteilung anbinden

Ich werde hier erklären, wie man vorgehen kann, falls eine weitere Abteilung das Ticketsystem nutzen möchte , jedoch  eigene Queues besitzen und nur Zugriff auf die Tickets in dieser Queue haben soll.

Vorgehensweise:

Nachdem ein Agent/mehrere Agenten für die Abteilung angelegt wurde(n), muss man Gruppen erzeugen.

Diese werden über die Administration und dem Menü Gruppen erstellt

OTRS_Admin_Gruppen

2014-02-10 13_53_33

2014-02-10 13_54_01

Zu diesen Gruppen fügen wir die Agenten hinzu.
Beispiel: Agent: „NeueGruppeAgent“ wird zur Gruppe „NeueGruppe“ hinzugefügt

2014-02-10 13_56_57

Entweder man definiert die Gruppen gleich nachdem man den Agenten erstellt hat oder später über das Menü Agent <-> Gruppen

Hier binden wir den Agenten an die jeweilige Gruppe

2014-02-10 13_57_25

Nun müssen wir die Queues erstellen und der Gruppe zuordnen. Dies kann man bei der Einrichtung einer Queue einstellen, ebenso kann man im gleichen Zug die E-Mail Adresse, welche Benachrichtigungen verschickt konfigurieren. Diese Mailadresse kann im Adminmenü unter E-Mail-Einstellungen -> E-Mail Adressen konfiguriert werden.

2014-02-10 14_13_31

Nachdem die Queues angelegt wurden, kann man noch die Benachrichtigungen anpassen.
Dazu einfach die Einstellungen der alten Benachrichtigungen übernehmen und die Queues, sowie den Text der neuen Benachrichtigung anpassen.

Damit wären wir soweit fertig. Nun kann man noch die Sichbarkeiten der Reiter anpassen, damit die Abteilung keinen Zugriff auf etwaige Addons oder die (Kunden)-Konfiguration hat

Reiter:

Damit die Abteilung nicht alle Reiter besitzt, muss man 1. sicherstellen, dass sie nicht den zu den Reitern gehörigen Gruppen zugeordnet sind (bspw. Reiter FAQ <=> Gruppe: faq, faq-admin, faq-approval) und 2. kann man in der SysConfig für jeden Reiter Sichtbarkeiten für Gruppen definieren.

Dies geht für viele Reiter in deren ModuleRegistration.
Beispiel Reiter Kunden:
Konfigurationseinstellungen bearbeiten in Framework -> Frontend::Admin::ModuleRegistration

 Frontend::Module###AdminCustomerUser

dort die Gruppen hinzufügen, welche den Reiter sehen sollen.

[OTRS] Queue in Übersicht ausblenden, Zugriff erhalten

Manchmal kann es vorkommen, dass man eine Queue im OTRS nicht in der Übersicht eingeblendet haben möchte, den Zugriff darauf aber benötigt (bspw. um immer wieder einen Überblick zu erhalten).
Um dies zu erreichen, kann man in den Einstellungen unter
Frontend::Agent::Ticket::ViewQueue
den Eintrag ViewAllPossibleTickets auf Ja setzen
2014-01-28 10_11_18-Ticket -_ Frontend__Agent__Ticket__ViewQueue - SysConfig - Admin - ACE Service P
Somit werden auch die Queues, auf welche man nur ‚ro‘-Berechtigung in der Queue Ansicht nach Queues angezeigt. Jetzt kann man für die Agenten die ‚rw‘-Berechtigung für die Gruppe , welche Berechtigung auf die Queue hat entfernen und damit die Queue aus der Übersicht entfernen.

[C#/.NET] Eigenen OpenFileDialog erstellen

Zwar hat das .NET-Framework mit den von der CommonDialog-Klassen ebernden Dialog-Klassen (dazu gehören OpenFileDialog, FolderBrowserDialog) schon Dialoge, welche die Funktion bieten Daten zu öffnen, zu speichern oder das Verzeichnis zu wählen. Diese sind aber leider nicht erweiterbar und daher nicht für sämtliche Zwecke zu gebrauchen.

In diesem Beitrag werde ich deshalb eine Möglichkeit aufzeigen, einen eigenen Dialog zu erstellen für verschiedene Zwecke zu erstellen.

Einfacher Dialog zum Öffnen von Dateien

Zum Erstellen eines einfachen OpenFileDialogs benötigen wir erstmal eine Form. In der Form platzieren wir ein TreeView, sowie zwei Buttons. Zusätzlich benötigen wir eine ImageList, welche die eigentlichen Icons der Dateien und Verzeichnisse zwischenspeichert und aus welcher wir die benötigten Icons beziehen werden.

Nachdem wir die benötigten Controls hinzugefügt haben, benötigen wir eine Methode, die uns alle Laufwerke in die TreeView lädt. Diese bilden nämlich jeweils den Stammknotenpunkt (RootTreeNode).

Die Methode sieht wir folgt aus und soll bei dem Aufruf der Form durchlaufen werden:

private void GetAllDrives()
{
	DriveInfo[] drives = DriveInfo.GetDrives();
	foreach (var drive in drives)
	{
		TreeNode rootTreeNode = new TreeNode();
		rootTreeNode.Text = drive.Name;
		rootTreeNode.Tag = drive.Name;
		rootTreeNode.ImageIndex = GetIconOfFile_Folder(drive.Name);
		rootTreeNode.SelectedImageIndex = rootTreeNode.ImageIndex;
		rootTreeNode.Nodes.Add(" "); //Placeholder to enable expanding (+)
		FolderAndFiles_treeView.Nodes.Add(rootTreeNode);
	}
}

Die Methode GetIconOfFile_Folder bezieht das Icon des Elements, wie es der Windows Explorer auch anzeigt.
Zum Beziehen wird der Namespace System.Runtime.InteropServices benötigt. Diesen binden wir per

using System.Runtime.InteropServices;

ein.
Folgender Code wird zum Beziehen der Icons benötigt:

[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
	public IntPtr hIcon;
	public IntPtr iIcon;
	public uint dwAttributes;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
	public string szDisplayName;
	[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
	public string szTypeName;
};

class Win32
{
	public const uint SHGFI_ICON = 0x100;
	public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
	public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon

	[DllImport("shell32.dll")]
	public static extern IntPtr SHGetFileInfo(string pszPath,
								uint dwFileAttributes,
								ref SHFILEINFO psfi,
								uint cbSizeFileInfo,
								uint uFlags);
}

private int GetIconOfFile_Folder(string Path)
{
	IntPtr hImgSmall;    //the handle to the system image list
	SHFILEINFO shinfo = new SHFILEINFO();

	hImgSmall = Win32.SHGetFileInfo(Path, 0, ref shinfo,
								   (uint)Marshal.SizeOf(shinfo),
									Win32.SHGFI_ICON |
									Win32.SHGFI_SMALLICON);

	System.Drawing.Icon myIcon =
		   System.Drawing.Icon.FromHandle(shinfo.hIcon);

	FolderAndFiles_imageList.Images.Add(myIcon);

	return FolderAndFiles_imageList.Images.Count - 1; //Ab 0 (zero) wird angefangen, somit ist die Gesamtzahl n+1
}

Bisher werden nur die aufklappbaren Laufwerke angezeigt. Sie besitzen jedoch noch keine weiteren Knoten. Diese füllen wir indem wir einen EventHandler für das BeforeExpand-Event mittels

FolderAndFiles_treeView.BeforeExpand += FolderAndFiles_treeView_BeforeExpand;

erstellen.

Die dazugehörige Methode FolderAndFiles_treeView_BeforeExpand sieht wie folgt aus:

private void FolderAndFiles_treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
	e.Node.Nodes.Clear();
	GetFilesAndFolder(e.Node, (string)e.Node.Tag);
}

Das Event ruft also die Methode GetFilesAndFolder auf, welche zuerst die unter dem erweiterten Knoten liegenden Knoten löscht und danach die Verzeichnisse und Dateien bezieht. Diese Methode benötigt zum einen den erweiterten Knoten, sowie das Verzeichnis aus welchem die Ordner und Dateien bezogen werden sollen (dies wurde im Tag gespeichert) als Parameter.
Die Methode selbst sieht wie folgt aus:

private void GetFilesAndFolder(TreeNode tn, string Path)
{
	try
	{
		string[] Directories = Directory.GetDirectories(Path);
		string[] Files = Directory.GetFiles(Path);

		foreach (string dir in Directories)
		{
			TreeNode dirTreeNode = new TreeNode();
			dirTreeNode.Tag = dir;
			dirTreeNode.Text = new DirectoryInfo(dir).Name;
			dirTreeNode.ImageIndex = GetIconOfFile_Folder(dir);
			dirTreeNode.SelectedImageIndex = dirTreeNode.ImageIndex;
			dirTreeNode.Nodes.Add(" ");
			tn.Nodes.Add(dirTreeNode);
		}

		foreach (string file in Files)
		{
			TreeNode fileTreeNode = new TreeNode();
			fileTreeNode.Tag = file;
			fileTreeNode.Text = new FileInfo(file).Name;
			fileTreeNode.ImageIndex = GetIconOfFile_Folder(file);
			fileTreeNode.SelectedImageIndex = fileTreeNode.ImageIndex;
			tn.Nodes.Add(fileTreeNode);
		}
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
	}
}

Den schwierigsten Teil haben wir jetzt hinter uns, die Dateien und Verzeichnisse werden bezogen und in der TreeView angezeigt und die jeweiligen Icons bezogen.
Jetzt müssen wir lediglich noch die zwei Buttons belegen.
Ich habe dies so gelöst:
Abbrechen

private void Cancel_button_Click(object sender, EventArgs e)
{
	this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
	this.Close();
}

Annehmen

private void Accept_button_Click(object sender, EventArgs e)
{
	string filePath = (string)FolderAndFiles_treeView.SelectedNode.Tag;
	if (CheckIfPathIsFile(filePath) == true) // Sollte es sich um eine Datei handeln
	{
		this.FilePath = filePath; //Bei FilePath handelt es sich um ein public Property
		this.DialogResult = System.Windows.Forms.DialogResult.OK;
		this.Close();
	}
	else //Sollte es sich um ein Verzeichnis handeln
	{
		FolderAndFiles_treeView.SelectedNode.Expand(); //erweitere den aktuell gewählten Knoten
	}
}

In der Methode des AcceptButton-ClickEvents wird auch geprüft, ob es sich bei dem gewählten Element um eine Datei oder ein Verzeichnis handelt. Dies geschieht mit folgender Methode:

private bool CheckIfPathIsFile(string Path)
{
	FileAttributes attr = File.GetAttributes(Path);
	if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
		return false;
	else
		return true;
}

Es wird also Wahr zurückgegeben, wenn es sich um eine Datei handelt.

Zu guter Letzt müssen wir nur noch den FileDialog aufrufen, dies geschieht mit folgender Methode:

private void OpenSimpleFileDialog()
{
	SimpleOpenFileDialog simpleOpenFileDia = new SimpleOpenFileDialog();
	if(simpleOpenFileDia.ShowDialog() == System.Windows.Forms.DialogResult.OK)
		MessageBox.Show(simpleOpenFileDia.FilePath);
}

Das Ergebnis sieht wie folgt aus:

2013-12-02 14_43_34-SimpleOpenFileDialog

© 2018 Abou Chleih. Alle Rechte vorbehalten.

Thema von Anders Norén.