2009-05-31 12 views
0

Ich habe ein Formular, das ein MDI-Container ist. In diesem Formular erstelle ich 6 untergeordnete Formulare mit jeweils einem Label:C# MDI Event Help

for (int i = 0; i < 6; i++) 
{ 
    Form window = new Form(); 
    window.Width = 100; 
    window.Height = 100; 

    window.MdiParent = this; 
    window.FormBorderStyle = FormBorderStyle.FixedToolWindow; 

    Label label = new Label(); 
    label.AutoSize = true; 
    label.Location = new System.Drawing.Point(1, 1); 
    label.Size = new System.Drawing.Size(35, 13); 
    label.TabIndex = 1; 
    label.Name = "label" + i.ToString(); 
    label.Text = window.Top.ToString(); 

    window.LocationChanged += new System.EventHandler(HERE); 

    window.Controls.Add(label); 
    window.Show();    
} 

Ich habe ein Ereignis für das Locationchanged für Fenster hinzugefügt. Nun, wie mache ich das, damit das Label die Windows-Position aktualisiert?

Antwort

1

Ich denke, diese Linie den Trick für Sie tun:

window.LocationChanged += new EventHandler(delegate(object o, EventArgs evtArgs) { 
    label.Text = window.Location.ToString(); 
}); 
+0

Funktioniert perfekt danke :) – Ozzy

0

Nun, es ist am einfachsten mit einem Lambda-Ausdruck oder eine anonyme Methode zu tun:

window.LocationChanged += (sender, args) => label.Text = window.Top.ToString(); 

Wenn Sie mit C# 1.1 Sie bräuchten ein bisschen schwieriger zu sein, weil der Markierung wird automatisch in C# 2+ erfasst - man müsste eine neue Klasse wie folgt erstellen:

internal class LocationChangeNotifier 
{ 
    private readonly Label label; 

    internal LocationChangeNotifier(Label label) 
    { 
     this.label = label; 
    } 

    internal void HandleLocationUpdate(object sender, EventArgs e) 
    { 
     label.Text = ((Control) sender).Top.ToString(); 
    } 
} 

dann verwenden Sie es als:

LocationChangeNotifier notifier = new LocationChangeNotifier(label); 
window.LocationChanged += new EventHandler(notifier.HandleLocationUpdate); 

sind Variablen nicht erfasst groß? :)

+0

Und Jons Lösung immer haben diese zusätzliche Note von Eleganz (abgesehen von Fenster.Top nicht die Position zurück ...); o) –

+0

Ich nahm an, dass nur "top" gesucht wurde, den ursprünglichen Wert gegeben. Es wäre merkwürdig, von * nur * zu überspringen und den höchsten Wert anzuzeigen, um den gesamten Standort anzuzeigen. Ich stimme zu, dass die Frage jedoch nicht klar ist :) –

+0

Richtig, das habe ich im ursprünglichen Codebeispiel wirklich vermisst; interpretierte "Position" im Text an Ort in meinem Code; Ich werde mein manchmal zu schnelles Lesen zusammen mit Englisch tadeln, das nicht meine Muttersprache ist ... –