Inhaltsverzeichnis         

© 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

  1. 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");