© Martin Korneffel, Stuttgart 2004 +++ email: trac@n.zgs.de +++ web: www.s-line.de/homepages/trac
Doku:
Namespace |
Inhalt |
---|---|
System.Windows.Forms |
|
System.Windows.Forms.Design |
|
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.
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()); }
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); }
Durch diese Klasse werden beliebig große Flächen zur Darstellung von Steuerelementen bereitgestellt.
Achtung: Der Maximum- Wert kann nie durch eine Interaktion erreicht werden. Der größte durch eine Interaktion erreichbare Wert ist Maximum – LargeChange + 1.
Durch diese Klasse wird die Aktivierungsreihenfolge der Steuerelemente verwaltet (TabIndex).
Achtung:
Wird eine Anwendung mittels Application.Exit werden
die Ereignisse Closing und Closed nicht mehr ausgelößt.
Nichtmodales öffnen eines Formulares:
Form.Show();
Modales Öffnen eines Formulares
Form.ShowDialog();
Der Vererbungsmechanismus wird angewendet, um Vorlagen für Formulare zu erstellen (z.B. Standardisiertes Menü etc.)
Mittels Visual Studio können die Controls innerhalb einer Form durch Werkzeuge ausgerichtet werden:
Visual Studio\Menü\Format
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 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 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
Setzen folgender Eigenschaft macht eine Form zu einem MDI- Container:
this.IsMdiContainer = true
Dem MDI- Container muß ein Menü hinzugefügt werden.
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(); }
From activeChild = this.ActiveMdiChild
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.
Das Layout der Anzeige der MDI- Kindfenster kann über die Methode LayoutMdi des Containerfensters gesteuert werden:
Form1.LayoutMdi(System.Windows.Forms.MdiLayout.ArrangeIcons);
|
.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 |
Icons für:
\Programme\Microsoft Visual Studio .NET\Common7\Grafphics\Bitmaps\OffCtlBr
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 ist die abstakte Basisklasse aller Eingabefelder für Text.
Mit dem Steuerelement RichTextBox können Dateinen im RTF- Format (ASCII- Code basiertes Format zum Dokumentenaustausch) editiert werden.
Zur Darstelltung des Programmfortschrittes dient das Steuerelement ProgressBar.
Zur tabellarischen Darstellung von Daten dient das DataGridView.
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.
-> Controls- Collection
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
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.
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 ) {...} ... } |
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 |
Imports System.ComponentModel <LicenseProvider(GetType(MyLicenseSys.MyLicenseProvider))> _ Public Class IPBox ... End Class
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
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
Nichtmodales öffnen eines Formulares:
Dlg.Show();
Modales Öffnen eines Formulares
Dlg.ShowDialog();
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.
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, ""); }
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");
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 stellt eine Art virtuellen Plotter dar. Es stellt die Routinen zum Zeichnen und Scalieren bereit.
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();
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:
Font fnt = new Font(string NameFontFamily, float Fonthöhe, FontStyle Stil, GraphicsUnit EinheitFürHöhenangabe);
Gemessen wird stets in der Einheit Display (= 1/100 Zoll).
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)
Zur Entwurfszeit können die Beschriftungen der Steuerelemente einer WindowsForm für mehrere Kulturumgebungen definiert werden. Dies geschieht folgendermaßen:
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.
Wenn die Form fertig ist, wird sie Globalisiert, indem die Eigenschaft Localizable in der Kategorie Entwurf auf true gesetzt wird.
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.
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.
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
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(); } : }
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")); }