2010-07-29 16 views
8

Ich habe einige Ereignisse, die ich selbst erstellt habe und fragte mich, wie ich sie anheben kann, wenn ich will.Benutzerdefinierte Ereignisse in C# WinForms anheben

Wahrscheinlich ist mein Anwendungsdesign auch durcheinander, könnte einen Blick darauf werfen, wenn Sie möchten.

Dies ist die Struktur

ProgramContext 
- Form MainWindow 
    + Control TextBox 
    + Control Button 
    + ... 

In diesem Fall hält die MainWindow.TextBox einige Informationen, die zur Laufzeit ziemlich oft aktualisiert wird. Also, ich brauche es irgendwie zu aktualisieren, wenn ich will (so kann es seine Daten aus der Datenbank neu laden, wo es gespeichert ist)

Ich habe versucht, ein EventHandler zu seinem Validating -Event, aber das schien nicht um den Trick zu machen. So

, im Grunde habe ich eine Methode, die die Daten in ProgramContext

DataTable table = _adapter.GetData(); 
foreach (DataRow row in table.Rows) 
{ 
    MainWindow.TextBox.Text += table.Text.ToString(); 
} 

nachlädt, die getan werden muss, wenn eine andere Methode (die neuen Daten in table schreibt) ausgeführt wird.

Irgendwelche Ideen?

Antwort

13

Bearbeiten: Es scheint, Ihre Frage ist mehr über das Einhängen in ein bestimmtes Ereignis, aber FWIW unten ist, wie benutzerdefinierte Ereignisse im Allgemeinen ausgelöst werden.

Umgang mit dem TextBox Changed-Ereignisse

Von dem, was ich verstehe, wollen Sie eine externe Partei Ereignisse aus einem Textfeld auf einem Formular angehoben zu überwachen und dann auf einem anderen Formulardaten erneut zu laden?

Eine schnelle und schmutzig wäre, um das Formular TextBox öffentlich zu machen und dann könnten andere auf dieses Ereignis

MainForm.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 

OR, in neueren Versionen von C# abonnieren:

MainForm.textBox1.TextChanged += this.textBox1_TextChanged; 

Ihre Hinzufügen eigenes Custom Event

Ein anderer, saubererer Weg wäre raise a custom event, - z MyDataChangedEvent unten. Dadurch können Sie die Tatsache abstrahieren, dass die Änderungen überhaupt von einer Textbox kommen.

// Assuming you need a custom signature for your event. If not, use an existing standard event delegate 
public delegate void myDataChangedDelegate(object sender, YourCustomArgsHere args); 

// Expose the event off your component 
public event myDataChangedDelegate MyDataChangedEvent; 

// And to raise it 
var eventSubscribers = MyDataChangedEvent; 
if (eventSubscribers != null) 
{ 
    eventSubscribers(this, myCustomArgsHere); 
} 

Sie könnten auch die Ent Lib Composite Application Block-und Smart Client Software Factory sehen - das hat eine sehr flexible Ereignis Broking/pub Unter Mechanismus über UI "Smartparts" für die Synchronisierung (Kontrollen bildet Dialoge usw.) in einer lose gekoppelten Art und Weise.(CAB ist jetzt sehr datiert).

+3

In Ihrem Beispiel, anstatt eine neue Delegierten zu erklären, würde es klarer sein, nur die allgemeine Verwendung 'EventHandler' wie in' public event Eventhandler MyEvent' –

+0

Ich habe auch versucht zu 'TextChanged' Einhaken, aber Das wird in einer Endlosschleife enden, da ich den Text im EventHandler ändern möchte. –

+1

Sie können den Text innerhalb des Handlers ändern, aber Sie müssen das Ereignis für die Dauer der Methode entfernen.Sie können das folgendermaßen tun: rufen Sie 'this.TextChanged - = SomeClassName_TextChanged' auf, um das Ereignis für diesen Aufrufer zu deaktivieren, tun Sie etwas in der Methode und rufen Sie' this.TextChanged + = SomeClassName_TextChanged' auf, um das Ereignis erneut zu aktivieren. – Nebula

Verwandte Themen