Posts mit dem Label C# werden angezeigt. Alle Posts anzeigen
Posts mit dem Label C# werden angezeigt. Alle Posts anzeigen

Dienstag, 27. Oktober 2009

Dot Net (C#): lokalisiertes PropertyGrid ; lokalisierte Attribute

In der heutigen Zeit wird eine Anwendung meistens für mehrere Sprachen realisiert. Mit Microsoft .NET ist es kein Problem, Windows-Anwendungen zu lokalisieren. Doch immer wieder kommt die Frage auf, wie man Attribute, insbesondere solche für das PropertyGrid (Description, DisplayText, Category), lokalisieren kann.

Da meine Internetrecherche zu diesem Thema kaum brauchbare Beispiele hervorbrachte, möchte ich an einem Minimalbeispiel darauf eingehen:

Als erstes brauchen wir eine Klasse, die lokalisiert werden soll, nehmen wir in diesem Fall eine "Person":

namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
public String FirstName { get; set; }
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}

Normalerweise würde man die Klasse nun wir folgt mit Attributen versehen:
[DescriptionAttribute("Der Vorname dieser Person")]
public String FirstName { get; set; }

[DescriptionAttribute("Der Nachname dieser Person")]
public String LastName { get; set; }

Diese Vorgehensweise hat jedoch den Nachteil, dass die Attribute nicht lokalisierbar sind. Leider gibts es in .NET keine Möglichkeit, solche Attribute problemlos zu lokalisieren, da deren Information von der Laufzeitumgebung einmal eingelesen wird (per Reflection) und danach nicht mehr aktualisiert. Mit einem kleinen Trick kann man jedoch zumindest dafür sorgen, dass genau in diesem Momemt die Attribute der Sprache angepasst werden. Dazu ist es als erstes notwendig, die lokalisierten Texte wie gewohnt in einer beliebigen Resource-Datei abzulegen.



Als nächstes muss eine Klasse her, die es einem Attribut ermöglicht, seine Informationen aus einer Resource-Datei zu laden. Ich zeige das Verfahren am Beispiel des Description-Attributes, es kann alternativ mit dem Category- und DisplayText-Attribut verfahren werden:

Lediglich ein privates Feld (oder Property) sowie das Überschreiben des Get-Property sind notwenidg.
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
/// <summary>
/// Contains the name of the resource-string
/// </summary>
private string rDescription;

/// <summary>
/// Creates a new LocalizedDescription Attribute instance
/// giving it the name of the resource-string
/// </summary>
/// <param name="description"></param>
public LocalizedDescriptionAttribute(string description)
{
this.rDescription = description;
}

/// <summary>
/// (Overridden) Get: fetching the description during runtime
/// from the Resources (with respect to the current culture)
/// </summary>
public override string Description
{
get
{
return Properties.Resources.ResourceManager.GetString(
this.rDescription,
Thread.CurrentThread.CurrentCulture
);
}
}
}

Als nächstes ist es notwendig, die Klasse Person abzuändern und das neue Attribut einzusetzen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedDescriptionAttribute("PersonFirstName")]
public String FirstName { get; set; }
[LocalizedDescriptionAttribute("PersonLastName")]
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Eine fertige Klasse könnte wie folgt aussehen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonFirstNameDescription"),
LocalitedDisplayTextAttribute("PersonFirstNameDisplayText")]
public String FirstName { get; set; }

[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonLastNameDescription"),
LocalitedDisplayTextAttribute("PersonLasttNameDisplayText")]
public String LastName { get; set; }

// other properties

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Das gesamte Beispiel könnt ihr hier runterladen: localizablepropgridcode.rar (14,6 KB)

Freitag, 13. Februar 2009

Software-Portal software.marioschneider-online.de

Seit Jahren findet ihr auf meiner privaten Webseite jede Menge Programme, meist kleine Tools, die einem die Arbeit am PC erleichtern oder beim Programmieren unterstützen. Da ich für diese Programme gern eine zentrale Anlaufstelle einrichten wollte, ist vor kurz das Portal software.marioschneider-online.de online gegangen. Dort findet ihr von nun an alle Informationen zu meinen Tools, incl. Versionsverlauf, Screenshots und den entsprechenden Download-Links.

Tool-Liste (auszugsweise:)

  • CD-Manager (Delphi) - Verwaltung von CDs/DVDs für Spiele und Filme incl. Verleihliste
  • File Extractor (C#) - Komfortables Entpacken mehrerer Rar-Archive, incl. Passwortselektor
  • HTML Map Creator (C#), erzeugt HTML-Image-Maps (mehrere Links auf einem Bild)
  • Icon Viewer - (C#) Navigator für Bilder und Icons (übersichtliche Darstellung von ico, gif, png, bmp etc.)
  • Libra XHTML-Editor (C#) sehr komfortabler HTML-Editor mit grafischer (Block-)Darstellung von HTML-Elementen
  • Millhouse (Java) Brettspiel Mühle inc. KI-Gegner, Netzwerkunterstützung und verschiedenen Skins
  • Notizblock .Net (C#) Programm zur übersichtlichen Verwaltung von beliebigen Notizen in mehreren Kategorien
  • Passwort Verwalter Dot Net (C#) Sehr komfortables Programm zur Verwaltung beliebiger sensibler Daten (Passwörter, Logins) incl. iTan-Listen u.v.m
  • RegEx Test (C#) Testen von regulären Ausdrücken cinl. Beispielen, Trefferanzeige, Gruppenanzeige etc.
  • Text-Editor (Delphi) ermöglicht das Editieren von Texten nach vielen Kriterien

Weiterhin sind auf der Website div. Code-Snippets sowie Beispielanwendungen zu div. Themen zu finden.

software.marioschneider-online.de

Donnerstag, 31. Juli 2008

Passwort Verwalter Dot Net - Version 1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.2 bietet folgende neue Features:

  • Bugfix: Aktivierung/Deaktivierung von Menüpunkten im Hauptmenü
  • Bugfix: Programminterne Hilfe: Sprung zum jeweiligen Kapitel
  • Bugfix: Suche: Markierung des Treffer-Feldes
  • Bugfix: Verzögerung beim (1.) Anzeigen des Suchen-Dialogs
  • Backupmanager hinzugefügt
  • Datenfelder können nachträglich gelöscht werden (sofern keine Daten mehr in diesem Datenfeld vorhanden sind)
  • Einträge können in andere Kategorien verschoben werden
  • Feedbackdialog hinzugefügt
  • Logindialog überarbeitet (Untersützung für Schlüsseldateien)
  • Hauptfenster kann in der Größe (begrenzt) verändert werden
  • Neues Tool "Notizblock" verfügbar
  • Schlüsseldateien (Keyfiles) verfügbar (incl. 4 Sichermeitsmodi)
  • Standard-Zufallspasswort kann konfiguriert werden
  • Verwendete Datei kann per Drag & Drop in Start- sowie Loginform geändert werden
  • Verzeichnis der aktuellen Datei kann im Explorer angezeigt werden (Haupfenster-Menüeintrag)

Projekt-Homepage: www.pwvdotnet.org

Direktdownload: pwvdotnet_v1200_setup.exe oder pwvdotnet_v1200.zip (portable)

Mittwoch, 30. Juli 2008

Dot Net (C#): Screenshot von einem Control erzeugen

Folgende zwei Methoden sind nötig, um einen Screenshot von einem Control zu erzeugen und diesen in eine Datei zu speichern:

   1:  public static Bitmap takeScreenshot(Control pControl)
   2:  {
   3:      Bitmap bmp = new Bitmap(pControl.Width, pControl.Height);
   4:      pControl.DrawToBitmap(bmp, Rectangle.FromLTRB(0, 0, pControl.Width, pControl.Height));
   5:      return bmp;
   6:  }
   7:   
   8:  public static Boolean saveScreenshotToFile(Control pControl, String pFilename)
   9:  {
  10:      try
  11:      {
  12:          takeScreenshot(pControl).Save(pFilename);
  13:          return true;
  14:      }
  15:      catch (Exception)
  16:      {
  17:          return false;
  18:      }
  19:  }

Die erste Methode nimmt einen Screenshot auf und speichert diesen in einem Bitmap-Objekt. Die zweite Methode kann genutzt werden, um den Screenshot direkt in eine Datei zu speichern.

Dienstag, 17. Juni 2008

Dot Net (C#): Drag & Drop

Drop von Dateien / Ordnern:

1. Vorbereitung:

"AllowDrop"-Property setzen und 2 Events anmelden:

   1:  public MainForm()
   2:  {
   3:      InitializeComponent();
   4:      this.textboxDir.AllowDrop = true;
   5:      this.textboxDir.DragOver += new DragEventHandler(textboxDir_DragOver);
   6:      this.textboxDir.DragDrop += new DragEventHandler(textboxDir_DragDrop);
   7:  }


2. Drag Over-Event:

DataFormat überprüfen und DragDropEffects setzen:

   1:  void textboxDir_DragOver(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Data.GetDataPresent(DataFormats.FileDrop))
   4:      {
   5:          e.Effect = DragDropEffects.Move;
   6:      }
   7:  }


3. Drag-Drop-Event:

Drop auswerten:

   1:  void textboxDir_DragDrop(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Effect == DragDropEffects.Move) // if move
   4:      {
   5:          if (e.Data.GetDataPresent(DataFormats.FileDrop)) // if file drop
   6:          {
   7:              string[] dirNames = (string[])e.Data.GetData(DataFormats.FileDrop);
   8:              if (dirNames.Length.Equals(1)) // wenn genau eine datei
   9:              {
  10:                  if (MSUtils.FileUtil.dirExists(dirNames[0]))
  11:                  {
  12:                      this.textboxDir.Text = dirNames[0];
  13:                  }
  14:              }
  15:          }
  16:      }
  17:  }

Dienstag, 8. April 2008

Dot Net (C#): Invoke()-Methode für MultiThread-Applikationen mit WindowsForms

Um ein Control auf einer WindowsForms von einem anderen Thread aus zu verändern, muss die Invoke()-Methode der Form oder des Controls verwendet werden. Ein Control darf nur von dem Thread geändert werden, von dem es erzeugt wurde!

Folgendes Minimal-Beispiel (unvollständig) zeigt einen Anwendungsfall, in dem ein Thread seinen Status an eine Form berichtet:

Die Klasse MathClass erzeugt Thread-Objekte, deren Methode CalcBackground() in einem Thread ausgefürt wird.Aus dieser Methode heraus soll die GUI über den aktuellen Thread-Status informiert werden:

   1:   
   2:      public class MathClass
   3:      {
   4:   
   5:          private MainForm myForm;
   6:          private int iNumber;
   7:   
   8:          public Thread Initialize(MainForm myform, int number)
   9:          {
  10:              this.myForm = myform;
  11:              this.iNumber = number;
  12:              return new Thread(new ThreadStart(this.CalcBackground));
  13:          }
  14:   
  15:          delegate void UpdateUI(int number, int state);
  16:          delegate void Finish(int number);
  17:   
  18:          public void CalcBackground()
  19:          {
  20:              UpdateUI updateUI = new UpdateUI(this.myForm.updateUIProc);
  21:              Finish finish = new Finish(this.myForm.FinishThread);
  22:   
  23:              try
  24:              {
  25:                  // do something
  26:                  // ...
  27:                  // report status to form:
  28:                  object[] param = new object[2] { this.iNumber, i };
  29:                  myForm.Invoke(updateUI, param); // call myForm.updateUIProc(iNumber, i)
  30:              }
  31:              catch (ThreadAbortException)
  32:              {
  33:                  // clean up
  34:              }
  35:              catch (Exception)
  36:              {
  37:                  // catch any other exception
  38:              }
  39:              finally
  40:              {
  41:                  try
  42:                  {
  43:                      // call myForm.FinishThread(iNumber)
  44:                      myForm.Invoke(finish, new object[] { this.iNumber }); 
  45:                  }
  46:                  catch (ObjectDisposedException e)
  47:                  {
  48:                  }
  49:                  catch (Exception ee)
  50:                  {
  51:                  }
  52:              }
  53:          }
  54:   
  55:      }

Die Mainform erzeugt in der Methode startThreads() zwei neue Threads. Die Methoden updateUIProc() sowie FinishThread() werden per Invoke()-Methode von Thread aus gestartet und laufen selbst im Thread der Mainform:
   1:      public partial class MainForm : Form
   2:      {
   3:   
   4:          public MainForm()
   5:          {
   6:              InitializeComponent();
   7:          }
   8:   
   9:          private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  10:          {
  11:              // kill threads before form closes
  12:              if (anyThreadAlive)
  13:              {
  14:                  killThreads();
  15:              }
  16:          }
  17:   
  18:          public void updateUIProc(int number, int val)
  19:          {
  20:              this.textBox1.AppendText(
  21:                  string.Format("thread {0} has done {1} % of its job", number, val));
  22:          }
  23:   
  24:          public void FinishThread(int number)
  25:          {
  26:              this.textBox1.AppendText(
  27:                  string.Format("thread {0} has finished", number));
  28:          }
  29:   
  30:          private void startThreads()
  31:          {
  32:              Thread th1 = new MathClass().Initialize(this, 0);
  33:              Thread th2 = new MathClass().Initialize(this, 1);
  34:              th1.Start();
  35:              th2.Start();
  36:          }
  37:      }

Es ist nicht erlaubt, das Control Mainform.textBox1 direkt aus dem Thread zu verändern.Ein Control darf nur von dem Thread verändert werden, von dem es erstellt wurde.Um trotzdem ein Control aus einem Thread heraus zu verändern, benutzt man die Methode Invoke() und übergibt dieser ein delegate (Funktionszeiger) sowie ein Parameterarray. Die eigentliche Methode (z.B. updateUIProc() oder FinishThread()) läuft anschließend (in diesem Fall) im Thread der MainForm. Dies hat ebenfalls zur Folge, dass keine der beiden Funktionen parallel mehrmals ausgeführt werden kann.

Donnerstag, 3. April 2008

Dot Net (C#): SearchOption.AllDirectories für GetDirectories()

Die Methode GetDirectories() der Klasse DirectoryInfo liefert alle zu einem Suchpattern passenden Verzeichnisse. Dabei liefert der Aufruf

dir.GetDirectories("Release*")

beispielsweise alle Verzeichnisse, die mit "Release" beginnen. Um dies für alle Unterverzeichnisse nicht rekursiv programmieren zu müssen, gibt es die Möglichkeit, die GetDirectoties()-Methode mit einem weiteren Parameter zu füttern:

dir.GetDirectories("Release*", SearchOption.AllDirectories)

Bei diesem Aufruf werden automatisch alle Unterverzeichnisse abgesucht. Dies erspart einem das rekursive Aufrufen von Methoden, was den Code wesentlich kürzer macht.

Genauso verhält es sich mit der Methode GetFiles().

Visual Studio: Methoden nachträglich generieren

Seit dem Visual Studio 2008 kann man Methoden nachträglich automatisch generieren lassen. Nehmen wir an, wir wollen (später) die folgende Methode generieren:

processDir(listFiles, this._strPath, pattern);

Nun schreibt man diese Methode einfach als Aufruf hin, obwohl diese noch nicht existiert. Ein anschließender Rechtsklick auf den Methodennamen sowie ein Klick auf den Eintrag "Generate Method Stub" erzeugt die angegebene Methode incl. der vorgegebenen Signatur in der aktuellen Klasse.


Anklicken für Vollansicht

Es wird folgende Methode generiert:
private void processDir(List<string> listFiles, string p, string pattern)
{
throw new NotImplementedException();
}

Die erzeugte Methode ist private, evtl. Rückgabewerte werden ebenfalls angelegt.

Dies ermöglicht einem, den Code für einen Anwendungsfall vollständig zu schreiben, ohne zwischendurch wegen anderen Methoden, die man später implementieren will, unterbrochen zu werden.

Mittwoch, 12. März 2008

Passwort Verwalter Dot Net - Version 1.1.3

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.3 bietet folgende neue Features:

  • FTP-Download:
    • Änderungsdatum der Datei korrigiert
    • Zugriffsdatum der Datei korrigiert
    • Erstellungsdatum der Datei korrigiert
  • HTML-Export:
    • Nachricht "Bitte warten" wird angezeigt, während der Report generiert wird
    • Statistikberechnung wird nur noch für ausgewählte Kategorien durchgeführt
  • Markierung von Eingabefeldern (gelbe Hervorhebung) kann deaktiviert werden
  • neue Engine zur Berechnung der Passwort-Sicherheit
  • neue Engine zur Erzeugung von Passwörtern
  • neuer Evaluierungs-Dailog für Passwörter
  • Passwort Generierung: Eigenschaften des Passworts per Kontextmenü wählbar (Länge, Zahlen, Sonderzeichen)
  • Statistik: "Bitte warten" Nachricht wird angezeigt, während die Statistik berechnet wird
  • Statistik und HTML-Export zeigen 3-spaltige Passwort-Sicherheit (Punkte, Prozent, Wort) an

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1130_setup.exe oder pwvdotnet_v1130.zip

Donnerstag, 28. Februar 2008

Passwort Verwalter Dot Net - Version 1.1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.2 bietet folgende neue Features:

  • Datensatz kann einzeln als Textdatei extrahiert werden
  • "Daten speichern"-Button im Hauptfenster ermöglicht nun ebenfalls das Verwerfen der Änderungen
  • Eingabefelder werden dezent gelb hervorgehoben
  • FTP-Zugriff:
    • Aktivierung und Deaktivierung des automatischen Uploads von der Toolbar aus
    • Fortschrittsanzeige für FTP-Upload und -Download
    • Programm beendet sich, wenn bei der heruntergeladenen Datei das Passwort geändert wurde
  • horizontale Scrollbar für Eintragsliste
  • sicherer Passwort-Eingabe-Dialog für Schutz vor Keyloggern
  • Hilfe-Fenster kann minimiert und maximiert werden
  • HTML-Export: zu exportierende Kategorien auswählbar
  • HTML-Export: Zeichen "<", ">" und "&" werden nun korrekt dargestellt
  • Kompaktansicht hinzugefügt (Minimierung der Ansicht auf das Datenfeld)
    • enthält nur relevante Datenfelder
    • kann in einer beliebigen Bildschirmecke positioniert werden
    • kann mit der Maus verschoben werden
  • TAN-Verwaltung:
    • TAN-Listen sind alphabetisch sortiert
    • es kann nur noch eine TAN-Nummer gleichzeitig selektiert werden
    • Upload der Datei erfolgt nicht mehr, wenn die Änderung verworfen werden

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1120_setup.exe oder pwvdotnet_v1120.zip

Mittwoch, 27. Februar 2008

Dot Net (C#): List.ForEach() Methode

Verwenden der ForEach()-Methode einer Generic-List:

static void Main()
{
List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");

// Display the contents of the list using the Print method.
names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#
// to display the contents of the list to the console.
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
}

private static void Print(string s)
{
Console.WriteLine(s);
}


Generisch als Erweiterungsmethode für IEnumerable:
public static class IEnumerableExtension
{
public static void PrintItem<T>(this T item)
{
Console.WriteLine(item.ToString());
}

public static void PrintAllItems<T>(this IEnumerable<T> enumerable)
{
foreach (T item in enumerable)
{
PrintItem(item);
}
}
}

Dienstag, 19. Februar 2008

C# Code für HTML formatieren

Manoli.net bietet eine einfache Oberfläche, um beliebigen C#-Code für die Verwendung in HTML (also Blogs, Webseiten etc.) zu formatieren:

www.manoli.net/csharpformat/

Donnerstag, 7. Februar 2008

Passwort Verwalter Dot Net - Version 1.1.1

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.1 bietet folgende neue Features:

  • TAN-Verwaltung incl. iTAN-Verfahren
  • Export der Datei ins HTML-Format
  • Programm ist Freeware (kostenlos)

Screenshots:
Hauptfenster:

Kategorie erstellen
(völlig freie Konfiguration):

iTAN-Verwaltung:

Statistik:


(Klick auf ein Bild, um es zu vergrößern)


Weitere Features des Passwort Verwalter Dot Net:
  • Gruppierung der Einträge in frei konfigurierbare Kategorien
  • 256 Bit AES-Verschlüsselung für eine hohe Sicherheit der Daten
  • Sortieren nach Name, Zeitpunkt "hinzugefügt" oder Zeitpunkt "letzte Änderung"
  • Enthält einen Passwortgenerator zur Erstellung sicherer Passwörter auf Knopfdruck
  • Benutzer bestimmt, welche Daten sensibel sind und nicht als Klartext angezeigt werden
  • Anzeige sensibler Daten als Klartext per Tastenkombination oder Klick jederzeit möglich
  • Schelles Kopieren von Benutzernamen, Passwörtern etc. in die Zwischenablage
  • Automatisches Löschen sensibler Daten aus der Zwischenablage nach 5-20 Sekunden
  • Detailinformationen über Passwortsicherheit(Sicherheitslevel, Verbesserungsvorschläge)
  • Anzeige der Sicherheitsstufen von Passwörtern (incl. Verbesserungsvorschlägen)
  • Ausführliche Statistik (Anzahl der Passwörteraller Kategorien, Sicherheitseinstufung von Passwörtern)
  • Komfortable Updatefunktionalität (auf Wunsch automatisch bei jedem Programmstart)
  • FTP-Upload und -Download zum Abgleich der Daten auf mehreren Rechnern
  • Minimierung des Programms in den Systemtray oder Taskleiste
  • Komfortable Suchfunktion mit Ergebnis-Hervorhebung


Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1110_setup.exe oder pwvdotnet_v1110.zip

Montag, 4. Februar 2008

Dot Net (C#): Serialisieren (binär)

Serialisierung von Objekten in C# (binär):

Namespace: System.Runtime.Serialization.Formatters.Binary

/* zwei Objekt der zu serilisierenden Klasse anlegen */
objectKlasse object1b = new objectKlasse(10, "Hallo");
objectKlasse object2b = new objectKlasse(11, "Welt");

/* binary formatter anlegen */
BinaryFormatter binForm = new BinaryFormatter();

/* beide Objekte serialisiert nach C:\text.txt schreiben */
using (FileStream fs = new FileStream("C:\\test.txt", FileMode.Create))
{
binForm.Serialize(fs, object1b);
binForm.Serialize(fs, object2b);
}

/* zwei neue Objekte anlegen */
objectKlasse object11b = null;
objectKlasse object22b = null;

/* beide Objekte deserialisieren */
using (FileStream fs = new FileStream("C:\\test.txt", FileMode.Open))
{
object11b = (objectKlasse)binForm.Deserialize(fs);
object22b = (objectKlasse)binForm.Deserialize(fs);
}

/* deserialisierte Objektdaten ausgeben */
Console.WriteLine("Zahl: {0} , Wort: {1}", object11b.integer1, object11b.string1);
Console.WriteLine("Zahl: {0} , Wort: {1}", object22b.integer1, object22b.string1);

Alternativ:
XML-Serialisierung mit SoapFormatter aus dem Namespace System.Runtime.Serialization.Formatters.Soap

Montag, 21. Januar 2008

Dot Net (C#): Dauer ermitteln mit Stopwatch

Die Klasse Stopwatch aus dem Namespace System.Diagnostics ermöglicht es, Zeiten genau zu stoppen:

Stopwatch sw = new Stopwatch();
sw.Start();
/* do your work */
sw.Stop();
this.labelTime.Text =
"ElapsedTicks: " + sw.ElapsedTicks.ToString() +
"\nElapsedMilliseconds :" + sw.ElapsedMilliseconds.ToString() +
"\nElapsed(TimeSpan) :" + sw.Elapsed.ToString();

Samstag, 19. Januar 2008

Dot Net (C#): Enum in Combobox

Folgende Methode ermöglicht es, alle Elemente einer Enumeration in einer Combobox anzuzeigen:

private void importEnumeration(Type t)
{
this.comboBox.Items.Clear();
this.comboBox.Items.AddRange(Enum.GetNames(t));
this.comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
this.comboBox.SelectedIndex = 0;
}

Aufruf:

this.importEnumeration(typeof(anyEnum));