© Martin Korneffel,
Stuttgart 2004 - 2013 +++ www.mkoIt.de
1 Windows Forms Grundlagen
1.1 Ereignisgesteuerte Programmierung
1.1.1 Die Nachrichtenwarteschlange
Alle Ereignisse von Steuerelementen werden in
Nachrichten verpackt und die Nachrichtenwarteschlange der Applikation
gesendet. Das Applikationsobjekt fragt in einer Endlosschleife die
Nachrichtenwarteschlange ab und ruft registrierte Event Handler der
WinForm Objekte von der Anwendung auf.
1.2 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());
}
1.3 Application- Klasse
1.4 Lebenszyklus einer WinForm
1.4.1 Dispose
Spezieller Code bei der Destruktion einer Form
(z.B. Freigabe von Resourcen) muss 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);
}
1.5 Klassenhierarchie von WinForms
1.5.1.1 Klassifizierung
von Steuerelementen nach Funktion
|
Aktionen
starten
|
Auswahl
|
Container
|
edit
|
view
|
Button
|
X
|
|
|
|
|
Label
|
|
|
|
|
X
|
PictureBox
|
|
|
|
|
X
|
ProgressBar
|
|
|
|
|
X
|
Chart
|
|
|
|
|
X
|
TextBox,
|
|
|
|
X
|
X
|
ListBox
|
X
|
X
|
|
|
X
|
TreeView
|
X
|
X
|
|
|
X
|
MonthCalendar
|
X
|
X
|
|
|
X
|
RadioButton
|
X
|
X
|
|
X
|
X
|
DataGridView
|
X
|
X
|
|
X
|
X
|
ComboBox
|
X
|
X
|
|
X
|
X
|
Panel
|
|
|
X
|
|
|
1.5.2 Allgemeine Eigenschaften eines Steuerelementes (Control)
1.5.3 Color
1.5.4 ScrollableControl
Durch diese Klasse werden beliebig große
Flächen zur Darstellung von Steuerelementen bereitgestellt.
1.5.5 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.
1.5.6 ContainerControl
Durch diese Klasse wird die
Aktivierungsreihenfolge der Steuerelemente verwaltet (TabIndex).
1.6 Form
1.6.1 Position und Größe eines Formulares
1.6.2 Ereignisse eines Formulares
Achtung:
Wird eine Anwendung mittels Application.Exit werden
die Ereignisse Closing und Closed nicht mehr ausgelößt.
1.6.3 Anzeigen einer Form
Nichtmodales öffnen eines Formulares:
Form.Show();
Modales Öffnen eines Formulares
Form.ShowDialog();
1.6.4 Ableiten einer Userform (Vorlagen für Formen)
Der Vererbungsmechanismus wird angewendet, um
Vorlagen für Formulare zu erstellen (z.B. Standardisiertes Menü
etc.)
1.6.5 Ausrichten von Steuerelementen in einer Form
Mittels Visual Studio können die Controls
innerhalb einer Form durch Werkzeuge ausgerichtet werden:
Visual Studio\Menü\Format
1.6.6 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.
1.6.7 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
1.6.8 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
1.6.9 MDI-Anwendungen
1.6.9.1 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.
1.6.9.2 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();
}
1.6.9.3 Zugriff auf das aktuelle MDI-Kindfenster aus dem MDI-Container
From activeChild = this.ActiveMdiChild
1.6.9.4 Implementieren einer Fensterliste
Visual Studio kann automatisch Code
generieren, der eine Übersicht über alle bereits
geöffneten Fenster liefert, genannt Fensterliste. Dieser Code
ist an einen Menueintrag gebunden. Soll ein Menüeintrag zur
Anzeige der genannten Fensterliste führen, so ist seine
Eigenschaft MdiList auf true zu setzen.
1.6.9.5 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);
1.7 Programmdaten in Windows- Registry ablegen
1.8 Steuerelemente
1.8.1 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
|
1.8.2 ImageList
Icons für:
\Programme\Microsoft Visual Studio .NET\Common7\Grafphics\Bitmaps\OffCtlBr
1.8.3 Menüs
1.8.4 Toolbar
1.8.5 Statusbar
1.8.6 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.
1.8.7 TextBoxBase
TextBoxBase ist die abstakte Basisklasse aller
Eingabefelder für Text.
1.8.7.1 Textbox
1.8.7.2 RichTextbox
Mit dem Steuerelement RichTextBox können
Dateinen im RTF- Format (ASCII- Code basiertes Format zum
Dokumentenaustausch) editiert werden.
1.8.8 Listbox
1.8.9 Registerkarten mit TabControl
1.8.10 Tree View
1.8.11 Fortschrittsanzeige
Zur Darstellung des Programmfortschritts dient das
Steuerelement ProgressBar.
1.8.12 DataGridView (NET 2.0)
Zur tabellarischen Darstellung von Daten dient das
DataGridView.
1.8.12.1 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.
1.8.12.2 Binden eines ADO.NET Entity Framework Modells an
eine DataGridView
Dieses System ist in der mko.VB.Db Bibliothek
realisiert.
1.8.13 Steuerelemente während der Laufzeit einer
Form hinzufügen/entfernen
-> Controls- Collection
1.8.14 Benutzereingaben überprüfen
1.8.14.1 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
1.8.14.2 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.
1.9 Dialoge
1.9.1 Modale vs. Nichtmodal
Nichtmodales öffnen eines Formulares:
Dlg.Show();
Modales Öffnen eines Formulares
Dlg.ShowDialog();
1.9.2 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.
1.9.3 Auswählen von Verzeichnissen
1.9.4 Auswählen von Dateien
1.10 Bsp.: Öberfläche von TreeRobot
1.11 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, "");
}
1.11.1 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");