© Martin Korneffel, Stuttgart 2004 +++ email: trac@n.zgs.de +++ web: www.s-line.de/homepages/trac

Windows Forms

Inhalt

  1. Ereignisgesteuerte Programmierung

    1. Die Nachrichtenwarteschlange

  2. Einstiegspunkt einer Anwendung

  3. Application- Klasse

  4. Lebenszyklus einer WinForm

  5. Klassenhierarchie von WinForms

    1. Allgemeine Eigenschaften eines Steuerelementes (Control)

    2. Color

    3. ScrollableControl

    4. Scrollbar- Control

    5. ContainerControl

  6. Form

    1. Position und Größe eines Formulares

    2. Ereignisse eines Formulares

    3. Anzeigen einer Form

    4. Ableiten einer Userform (Vorlagen für Formen)

    5. Ausrichten von Steuerelementen in einer Form

    6. Tabulatorreihenfolge der Steuerelemente

    7. Verankern von Steuerelementen

    8. Docken von Steuerelementen

    9. MDI-Anwendungen

      1. Erzeugen des MDI- Containers

      2. Erzeugen der MDI- Kindfenster

      3. Zugriff auf das aktuelle MDI-Kindfenster aus dem MDI-Container

      4. Implementieren einer Fensterliste

      5. Organisieren der Anzeige der MDI- Fenster

  7. Programmdaten in Windows- Registry ablegen

  8. Steuerelemente

    1. Typen von Steuerelementen

    2. ImageList

    3. Menüs

    4. Toolbar

    5. Statusbar

    6. StatusStrip (NET 2.0)

    7. TextBoxBase

      1. Textbox

      2. RichTextbox

    8. Listbox

    9. Registerkarten mit TabControl

    10. Tree View

    11. Fortschrittsanzeige

    12. DataGridView (NET 2.0)

    13. Steuerelemente während der Laufzeit einer Form hinzufügen/entfernen

    14. Benutzereingaben überprüfen

      1. Validateting- Ereignis

      2. Klasse ErrorProvider

  9. Selbstdefinierte Steuerelemente

    1. Metainformation für die Entwicklungsumgebung in selbstdefinierte Steuerelementen

    2. Lizensierung von Steuerelementen

  10. Dialoge

    1. Modale vs. Nichtmodal

    2. Ok und Cancel - Rückgabewert eines Dialoges

    3. Auswählen von Verzeichnissen

    4. Auswählen von Dateien

  11. Bsp.: Öberfläche von TreeRobot

  12. Datenbindung

    1. Synchronisierung der Inhalte durch BindingManager

  13. Zeichnen

    1. Das Paint- Ereignis

    2. Das Graphics Objekt

      1. Erzeugen von Graphics- Objekten

      2. Maßeinheiten für das Zeichnen

      3. Koordinatentransformationen

    3. Werkzeuge zum Zeichnen

      1. Zeichnstifte (Pen)

      2. Farbrollen (Brush)

    4. Schriftausgabe (Font)

      1. Erzeugen eines neuen Schriftfonts

      2. Stilattribute eines Font- Objektes festlegen

      3. Ausgabe einer Zeichenkette im Grafikfenster

  14. Drucken

    1. Liste aller Installierten Drucker und Druckereinstellungen

    2. Druckprozess

    3. Argumente von QueryPageSettingsEventArgs

    4. Argumente von PrintPage

    5. Druckbereich

    6. Umrechnen von mm in Display (Standardeinheit)

    7. Konfiguration des Druckjobs mittels PrintDialog

  15. Globalisierung

    1. Internationalisieren einer WindowsForms

    2. Definition von Kulturumgebungen zur Laufzeit

      1. Objektmodell von Thread

      2. Objektmodell von CultureInfo

    3. Laden kulturspezifischer Strings aus Satellitenassemblies mit Ressourcemanager

Die Windows-Forms Bibliothek

Doku:

Namespace

Inhalt

System.Windows.Forms


System.Windows.Forms.Design




Ereignisgesteuerte Programmierung

Die Nachrichtenwarteschlange

Alle Ereignisste von Steuerelementen werden in Nachrichten verpackt und and die Nachrichtenwarteschlange der Application gesendet. Das Applikationsobjekt fragt in einer Endlosschleife die Nachrichtenwarteschlange ab und ruft registrierte Eventhandler der Winformobjekte von der Anwendung auf.


Einstiegspunkt einer Anwendung

Der Start der Anwendung erfolgt über die statische Methode Main. Diese ruft im wesenlichen die Methode Run des Applikationsobjektes auf.

[STAThread]
static void Main() 
{
   Application.Run(new FrmMain());
}

Application- Klasse


Lebenszyklus einer WinForm


Dispose

Spezieller Code bei der Destruktion einer Form (z.B. Freigabe von Resourcen) muß in der Dispose- Methode hinterlegt werden. Diese hat folgende Form:

protected override void Dispose(bool disposing) {

   if (disposing) {
      // Freigabe von Resourcen etc.
      // ...
   
      if (components != null) {
        components.Dispose();
      }
   }
   base.Dispose(disposing);
}

Klassenhierarchie von WinForms


Allgemeine Eigenschaften eines Steuerelementes (Control)


Color


ScrollableControl

Durch diese Klasse werden beliebig große Flächen zur Darstellung von Steuerelementen bereitgestellt.


Scrollbar- Control

Achtung: Der Maximum- Wert kann nie durch eine Interaktion erreicht werden. Der größte durch eine Interaktion erreichbare Wert ist Maximum – LargeChange + 1.




ContainerControl

Durch diese Klasse wird die Aktivierungsreihenfolge der Steuerelemente verwaltet (TabIndex).


Form


Position und Größe eines Formulares


Ereignisse eines Formulares


Achtung: Wird eine Anwendung mittels Application.Exit werden die Ereignisse Closing und Closed nicht mehr ausgelößt.

Anzeigen einer Form

Nichtmodales öffnen eines Formulares:

Form.Show();

Modales Öffnen eines Formulares

Form.ShowDialog();

Ableiten einer Userform (Vorlagen für Formen)

Der Vererbungsmechanismus wird angewendet, um Vorlagen für Formulare zu erstellen (z.B. Standardisiertes Menü etc.)


Ausrichten von Steuerelementen in einer Form

Mittels Visual Studio können die Controls innerhalb einer Form durch Werkzeuge ausgerichtet werden:

Visual Studio\Menü\Format

Tabulatorreihenfolge der Steuerelemente

Die Aktivierungsreihenfolge der Steuerelemente bei Betätigen der Tabulatortaste wird über die Eigenschaft TabIndex eines Steuerelementes definiert.

Im Visual Studio kann die Aktuvierungsreihenfolge durch ein Tool unter

Visual Studio\Menü\Tabulatorreihenfolge

neu gesetzt werden, indem die Steuerelemente in der richtigen Reihenfolge angeklickt werden.

Verankern von Steuerelementen

Verankern bedeutet, daß die Ränder eines Steuerelementes an die Ränder der umgebenden Form gebunden werden. Ändert sich die Göße der Form, dann ändert sich folglich auch die Position und Größe des betreffenden Steuerelementes.

Setzten der Eigenschaft. Beispiel. Ein Steuerelement wird an den linken, rechten und oberen Rand gebunden.

Control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right

Docken von Steuerelementen

Docken ist eine spezielle Form des Verankerns. Dabei Fallen mindestens zwei Ecken des Steuerelements mit zwei Ecken des Elternfensters zusammen.

Beispiel: Eine Textbox soll formatfüllent in einer Form untergebracht werden:

tbxEdit.Dock = DockStyle.Fill

MDI-Anwendungen

Erzeugen des MDI- Containers

Setzen folgender Eigenschaft macht eine Form zu einem MDI- Container:

this.IsMdiContainer = true

Dem MDI- Container muß ein Menü hinzugefügt werden.

Erzeugen der MDI- Kindfenster

MDI- Kindfenster zeichnen sich dadurch aus, daß sie über die Eigenschaft MdiParent auf das Elternfenster verweisen:

protected void mnuNeu_OnClick(object sender, System.EventArgs e) {
  // Erzeugen einer neuen Instanz der abgeleiteten Formklasse MyMdiChildForm
  MyMdiChildForm NewMdiChild = new MyMdiChildForm();
  
  // Die Form wird zum MDI- Child durch verweisen auf den MDI
  // Container über MDIParent
  NewMDiChild.MDIParent = this;

  // Anzeigen der neuen Form
  NewMDIChild.Show();
}

Zugriff auf das aktuelle MDI-Kindfenster aus dem MDI-Container

From activeChild = this.ActiveMdiChild

Implementieren einer Fensterliste

  1. Visual Studio kann automat. Code generieren, der eine Übersicht über alle bereits geöffneten Fenster liefert, genannt Fensterliste. Dieser code ist an eine Menueintrag gebunden. Soll ein Menüeintrag zur Anzeige der genannten Fensterliste führen, so ist seine Eigenschaft MdiList auf true zu setzen.

Organisieren der Anzeige der MDI- Fenster

Das Layout der Anzeige der MDI- Kindfenster kann über die Methode LayoutMdi des Containerfensters gesteuert werden:

Form1.LayoutMdi(System.Windows.Forms.MdiLayout.ArrangeIcons);



Programmdaten in Windows- Registry ablegen


Steuerelemente


Typen von Steuerelementen


.Net Steuerelemente

ActiveX- Steuerelemente

Einbinden über

Toolbox/Windows- Forms

Rechtsklick auf Toolbox/Element hinzufügen-entfernen/Com- Steuerelemente

Beispiel

Textboxcontrol:

Dim tbxName as TextBox

Excel- ähnliches Arbeistblatt (Microsoft Office Spreadsheet 9.0)

Dim r1 As OWC.Range =_ AxSpreadsheet1.ActiveSheet.Cells()

With r1
    .Item(1, 1).Value = 1
    .Item(2, 1).Value = 2
    .Item(3, 1).Formula = "=A1 + A2"
End With

ImageList

Icons für:

\Programme\Microsoft Visual Studio .NET\Common7\Grafphics\Bitmaps\OffCtlBr

Menüs

Toolbar

Statusbar


StatusStrip (NET 2.0)

StatusStrip ist eine Componente, welches die Wurzel eine Hirarchie von ToolStripItems ist, mit denen Statusinformationen als Text, Bild, Links oder Progressbars angezeigt werden kann.




TextBoxBase

TextBoxBase ist die abstakte Basisklasse aller Eingabefelder für Text.


Textbox


RichTextbox

Mit dem Steuerelement RichTextBox können Dateinen im RTF- Format (ASCII- Code basiertes Format zum Dokumentenaustausch) editiert werden.


Listbox


Registerkarten mit TabControl


Tree View


Fortschrittsanzeige

Zur Darstelltung des Programmfortschrittes dient das Steuerelement ProgressBar.


DataGridView (NET 2.0)

Zur tabellarischen Darstellung von Daten dient das DataGridView.


Binden von Datenquellen an DataGridView mit BindingSource

DataTables können direkt über die Eigenschaft DataGridView.DataSource an eine DataGridView gebunden werden. Besser ist es jedoch, zwischen DataGridView und der Quelle ein weiteres Steuerelement zu schieben: die BindingSource. Die BindingSource stellt eine streng typisierte Datanquelle dar, die zusätzlich über Filter- und Sortierfunktionen verfügt. Für die BindingSource ist der BindingNavigator geschaffen worden, mittels dem durch die Datensätze wie mit einer Videorecordersteuerung navigiert werden können.




Steuerelemente während der Laufzeit einer Form hinzufügen/entfernen

-> Controls- Collection

Benutzereingaben überprüfen

Validateting- Ereignis

Jedes Steuerelement löst beim verlust des Eingabefpcus das Ereigniss Validating aus, wenn die Steuerelementeigenschaft CausesValidation auf truegesetzt wurde. In diesem können die Eingaben geprüft, und im Falle eines Eingabefehlers der Verlust des Cursors Aufgehalten werden:

Private Sub tbxValid_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles tbxNoValid.Validating
        Try
            Convert.ToUInt32(tbxValid.Text)
            ErrorProvider1.SetError(tbxValid, "")
            ' Eingabefocus kann zu anderen Steuerlementen wechseln
            e.Cancel = False
        Catch ex As Exception
            ' Eingabefocus wird am wechseln zu anderen Steuerlementen gehindert
            e.Cancel = True
            ErrorProvider1.SetError(tbxValid, "Keine num. Eingabe !!")
        End Try
End Sub

Klasse ErrorProvider

Anzeige von Fehlermeldungen und markieren der Fehlerquelle kann mit einer Instanz der Klasse ErrorProvider erfolgen. Pro Form ist eine Instanz von Error- Provider erfoderlich. Aktiviert wird die Fehleranzeige, wenn der Methode SetError(Control, string) im 2. Parameter eine nichtleere Zeichenkette übergeben wird.




Selbstdefinierte Steuerelemente

Möglichkeiten zur Definition eigener Steuerelemente

Erweiterung bestehender Steuerelemente

Kombinieren bestehender Steuerelemente in einem ContainerControl

Ableiten neuer Steuerelemente aus der Klasse Control

class NumBox : TextBox {
  ...
}
class PairBox : Panel {
  private TextBox tbxX = new TextBox();
  private TextBox tbxY = new TextBox();
  ...
}
class XYDiagramm : Control {
  protected override void OnPaint
  (
       System.Windows.Forms.
       PaintEventArgs e
  ) {...}
  ...
}

Metainformation für die Entwicklungsumgebung in selbstdefinierte Steuerelementen

Selbstdefinierte Steuerelemente enthalten im allgemeinen neue Eigenschaften. Um diese in Entwicklungsumgebungen besser integrieren zu können, bietet daß .Net Framework einen Satz von Attributen an, mit denen die Eigenschaften ausgestattet werden können.

Die Attribute sind definiert im Namespace

System.ComponentModel

Attribute

Beschreibung

Beispiel

Browsable

Definiert, ob eine Eigenschaft im Eigenschaftsfenster eines Steuerelementes aufgelistet werden soll oder nicht


Category

Definiert die Gruppe innnerhalb des Eigenschaftsfensters, in welcher die Steuerelementeigenschaft gelistet wird

<Category("Data")> Public Property ...

Description

Legt einen Texblock, der im Fuß des Eigenschaftsfensters erscheint, wenn die Eigenschaft selektiert wird.

<Description("X- Wert der Koordinate")> ...

DefaultProperty

Definiert die Standardeigenschaft der Komponente. Nach dem anklicken ist diese im Eigenschaftsfenster aktiviert.

DefaultValue

Definiert einen Standardwert für die Eigenschaft

Lizensierung von Steuerelementen


Lizensierendes Steuerelement mit Lizensierungsprovider ausstatten

Imports System.ComponentModel
<LicenseProvider(GetType(MyLicenseSys.MyLicenseProvider))> _
Public Class IPBox
  ...
End Class

Im Konstruktor eine Lizenz anfordern

    Dim validatedLicense As License

    Public Sub New()
        MyBase.New()

        ' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
        InitializeComponent()

        ' Initialisierungen nach dem Aufruf InitializeComponent() hinzufügen
        validatedLicense = LicenseManager.Validate(GetType(IPBox), Me)
    End Sub

Lizenz am Lebensende der Instanz löschen

   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If

            If Not validatedLicense Is Nothing Then
                validatedLicense.Dispose()
                validatedLicense = Nothing
            End If

        End If
        MyBase.Dispose(disposing)
    End Sub

Dialoge

Modale vs. Nichtmodal

Nichtmodales öffnen eines Formulares:

Dlg.Show();

Modales Öffnen eines Formulares

Dlg.ShowDialog();

Ok und Cancel - Rückgabewert eines Dialoges

Die Methode ShowDialog() gibt einen Wert vom Aufzählungstyp DialogResult zurück. Über diesen wird angezeigt, wie der Dialog beendet wurde:

DialogResult

Bedeutung

DialogResult.Ok

Dialog wurde über Ok- Button beendet

DialogResult.Cancel

Dialog wurde über Cancel- Button beendet

...


Der Rückgabewert wird im Dialog durch setzen der Windows- Form- Eigenschaft DialogResult gesetzt Dies kann z.B. zur Laufzeit geschehen wie folgt:

 private void btnOK_Click(object sender, EventArgs e)
        {   
            DialogResult = DialogResult.Ok         
            ...
        }

Ebenfalls ist die Festlegung des Rückgabewertes zur Entwurfszeit möglich, in dem die Eigenschaft DialogResult der entsprechenden Befehlsschaltfläche gesetzt wird.

Auswählen von Verzeichnissen


Auswählen von Dateien


Bsp.: Öberfläche von TreeRobot


Datenbindung

Die Windows- Forms- Bibliothek implementiert einen allgemeinen Mechanismus zur Bindung der Inhalte von Steuerelementeigenschaften an Datenquellen. Datenquellen können dabei alle Objekte sein, die die IList - Schnittstelle oder Ableitungen davon implementieren.

Dokumentiert wird eine Bindung durch einen Objekt der Klasse System.Windows.Forms.Binding.


Jedes Steuerelement bestitzt die Eigenschaft DataBinding, welche auf eine Collection von Binding- Objekten verweist. Diese Liste von Binding- Objekten definieren alle Datenbindungen der Eigenschaften des Steuerelementes an Datenquellen:




Beispiel: Binden der Eigenschaft Text der Textbox tbxName an das Array namen.

 :
string namen[] = {"Donald", "Daisy", "Dagobert"};
 :
private void Form1_load(object sender, System.EventArgs eventargs) {

  // Arg1: Name der Steuerelementeigenschaft, die gebunden werden soll
  // Arg2: Name der Datenquelle
  // Arg3: Name der Spalte/ Eigenschafte von der Datenquelle  
  tbxName.DataBindings.Add("Text", namen, ""); 

}

Synchronisierung der Inhalte durch BindingManager

Die Binding- Objekte sind passiv. Die Synchronisierung der Daten zwischen Quelle und Steuerelementeigenschaft erfolgt durch BindingManager – Objekte.


Alle BindingManager sind von der abstrakten Klasse BindingManagerBase abgeleitet.


Alle BindingManager der Datenbindungen von Steuerelementen werden vom Elternsteuerelement in einem BindingContext- Objekt verwaltet. Dieses ist über die Eigenschaft BindingContext erreichbar (siehe Allgemeine Eigenschaften eines Steuerelementes (Control)).

Wurde z.B. ein Array an die Texteigenschaft einer Textbox gebunden, so hat die DataBinding.Add- Methode ein CurrencyManager – Objekt erzeugt. Die Count – Eigenschaft dieses zeigt die Anzahl der Elemente im gebundenen Array an. Current gibt die Referenz auf das Arrayelement zurück, dessen Inhalt im Steuerelement aktuell angezeigt wird. Mittels Position kann Current verändert werden: wird ein gültiger Index zugewiesen, dann erfolgt die Anzeige des Elementinhaltes in der Textbox:

// Rückwärts im Namensarray
private void btnDown_Click(object sender, System.EventArgs e)
{
  this.BindingContext[namen, ""].Position -= 1;
}

// Vorwärts im Namensarray
private void btnUp_Click(object sender, System.EventArgs e)
{
  this.BindingContext[namen, ""].Position += 1;
}

Das nächste Beispiel zeigt, wie eine spezielle Tabelle in einem DataSet an die DataSource- Eigenschaft eines Datagrids gebunden wird. Das Dataset heist dsTab und die zu bindende Tabelle hat den Namen TabMessdaten.

dgridTabMessdaten.DataBindings.Add("DataSource", dsTab, "TabMessdaten");

Zeichnen

Das Paint- Ereignis

Grafiken werden immer als Reaktion auf das Paint- Eireignis einer Form bzw. eines Controls (z.B. Picturebox) gezeichnet. Ausgelöst wird das Paint- Ereignis nach Größenänderungen am Control, oder Programmgesteuert, um eine neue grafische Ausgabe zu veranlassen.


Das Graphics Objekt

Das Graphics Objekt stellt eine Art virtuellen Plotter dar. Es stellt die Routinen zum Zeichnen und Scalieren bereit.




Erzeugen von Graphics- Objekten

Soll eine Grafik als Antwort auf ein Paint- Ereignis aufgebaut werden, dann ist das benötigte Graphics Objekt bereits durch den PaintEventArgs- Parameter bereitgestellt. Wird ein Graphics- Objekt außerhalb eines Paint- Eventhandlers benötigt, dann kann es innerhalb einer Form mittels der folgender Form-Methode erzeugt werden:

Graphics graph = this.CreateGraphics();
graph.DrawLine(...);
:

Nach Gebrauch eins derart erzeugten Graphics- Objektes mussen die von diesem reservierten Systemresourcen wieder freigegeben werden durch Aufruf der Dispose- Methode:

graph.Dispose();

Maßeinheiten für das Zeichnen

Die Maßeinheit für alle Koordinaten beim Zeichnen mit einem Graphics. Objekt werden über die Eigenschaft PageUnit zentral festgelegt. Sie ist vom Typ GraphicsUnit. Standard ist die Einheit GraphicsUnit.Pixel (Bildschirmpunkt). Folgende Einheiten können gewählt werden:


Koordinatentransformationen


Werkzeuge zum Zeichnen

Zeichnstifte (Pen)




Farbrollen (Brush)


Schriftausgabe (Font)

Erzeugen eines neuen Schriftfonts

Font fnt = new Font(string NameFontFamily, float Fonthöhe, FontStyle Stil, GraphicsUnit EinheitFürHöhenangabe);

Stilattribute eines Font- Objektes festlegen


Ausgabe einer Zeichenkette im Grafikfenster




Drucken

Liste aller Installierten Drucker und Druckereinstellungen


Druckprozess


Argumente von QueryPageSettingsEventArgs


Argumente von PrintPage


Druckbereich

Gemessen wird stets in der Einheit Display (= 1/100 Zoll).


Umrechnen von mm in Display (Standardeinheit)

Zur Umrechnung können die statischen Methoden aus der Klasse System.Drawing.Printing.PrinterUnitConvert benutzt werden:

' 5 mm in Display (1/100 Zoll) umrechnen
Dim mm5inDisplay As Integer = PrinterUnitConvert.Convert(50, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.Display)

Konfiguration des Druckjobs mittels PrintDialog


Globalisierung

Internationalisieren einer WindowsForms

Zur Entwurfszeit können die Beschriftungen der Steuerelemente einer WindowsForm für mehrere Kulturumgebungen definiert werden. Dies geschieht folgendermaßen:

  1. Aufbau der Windows Forms und Beschriften aller Steuerelemente in der Standardumgebung (z.B. in Deutsch). Die Standardumgebung ist technisch gesehen eine Resourcendatei (z.B. MyForm.resx). Sie ist eine Tabelle, die Steuerelement- Eigenschaften wie z.B. Text Beschriftungen als Strings zuordnet. Diese Tabelle wird beim Kompilieren in der Assembly angelegt. Die Beschriftungen aus den Standardumgebungen werden immer verwendet, wenn keine passende Resourcenassembly zum aktuellen Kulturkontext gefunden werden kann.

  2. Wenn die Form fertig ist, wird sie Globalisiert, indem die Eigenschaft Localizable in der Kategorie Entwurf auf true gesetzt wird.

  3. Jetzt kann die Eigenschaft Language auf einen speziellen Kulturkontext eingestellt werden (z.B. Englisch (USA)). Visual Studio 2005 legt jetzt eine neue Resourcendatei wie z.B. MyForm.de-DE.resx an.

  4. Alle Steuerelemente können jetzt mit neuen Beschriftungen, die zum gewählten Kulturkontext passen, beschriftet werden. Für jede neue Beschriftung wird in der neuen Resourcendatei wie z.B. MyForm.de-DE.resx eine Zeile eingetragen, die der Steuerelementeigenschaft den neuen Beschriftungstext zuordnet.

  5. Die Anwendung muss neu erstellt werden. Das Ergebnis sind die zuvor erstellten Assemblys + einer neuen Assembly pro Kulturkontext in einem für den Kulturkontext spezifischen Unterverzeichnis wie en-US/MyForm.resources.dll

Definition von Kulturumgebungen zur Laufzeit

Namensraum: System.Globalization

Die Formatierung von Ausgaben bzw. das Parsen von Eingaben einer WindowsForms- Anwendung kann an einen kulturellen Kontext angepasst werden. Gewöhnlich wird die Kulturumgebung zentral im Betriebssystem unter Systemsteuerung/Regions und Sprachoptionen eingestellt. Diese werden von der CLR beim Laden einer Assembly eingelesen und unter

Thread.CurrentThread.CurrentCulture 

der Anwendung verfügbar gemacht.

Dieser voreingestellte Kulturkontext kann durch ein neues Typ CultureInfo überschrieben werden. Dem Kontruktor von CultureInfo ist eine Kombination aus einem ISO639-1 Sprachcode und einem ISO3166 Regionalcode zuzuweisen.

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

Sollen auch die Beschriftungen der Steuerelemente in einer WindowsForms Anwendung angepasst werden, dann muss zusätzlich noch die CurrentUICulture Eigenschaft des aktuellen Threads gesetzt werden:

Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

Damit sich diese Einstellungen auf den Ladevorgang der Steuerelemente auswirken können, müssen sie im Konstruktor einer WindowsForms vor dem Aufruf von InitilizeComponent() aufgerufen werden:

public partial class MyForm {
        public MyForm()
        {
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
            InitializeComponent();            
        }
        :
}

Objektmodell von Thread


Objektmodell von CultureInfo


Laden kulturspezifischer Strings aus Satellitenassemblies mit Ressourcemanager

Resourcendateien müssen stets einem Kulturkreis zugeordnet werden. Wird eine Resourcendatei mittels Visual- Studio angelegt, dann muß der Name dem Schema Dateiname.Kulturcode.resx folgen. Z.B.

myRes.de-DE.resx

Aus diesen Resourcendateien werden schließlich Satellitenassemblies generiert, die in Unterverzeichnissen unterhalb des bin Verzeichnisses angelegt werden (bin/de-DE/DMSsimpel.resources.dll)




Laden der Resourcen mit Resourcenmanager.

protected ResourceManager gRes = new ResourceManager("DMSsimpel.res", typeof(search).Assembly);

Laden von Zeichenketten aus den Resourcen:

private void btn1_click(object sender, System.EventArgs e)
{
  
    // Durch Setzen der UICulture wird die entsprechende Satellitenassembly
    // geladen

    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

    // Strings aus der Resourcendatei laden

    MessageBox.show(gRes.GetString("search.btnSearch"));                        
  

}