it-swarm.dev

Hinzufügen eines Ereignisses zu einem UserControl in C #

Ich habe ein UserControl, das 3 Bezeichnungen enthält. Ich möchte ein Ereignis hinzufügen, das auftritt, wenn sich der Text einer der Beschriftungen ändert.
Ich verwende Visual Studio 2010

24
Saeed

Zuerst müssen Sie das Ereignis innerhalb Ihrer Klasse (neben Ihren Methoden und Konstruktoren) deklarieren:

public event EventHandler LabelsTextChanged;

Dann müssen Sie eine Methode erstellen, um die TextChanged-Ereignisse der einzelnen Labels zu behandeln.

private void HandleLabelTextChanged(object sender, EventArgs e)
{
    // we'll explain this in a minute
    this.OnLabelsTextChanged(EventArgs.Empty);
}

Irgendwo, wahrscheinlich im Konstruktor Ihres Steuerelements, müssen Sie die TextChanged-Ereignisse des Labels abonnieren.

myLabel1.TextChanged += this.HandleLabelTextChanged;
myLabel2.TextChanged += this.HandleLabelTextChanged;
myLabel3.TextChanged += this.HandleLabelTextChanged;

Nun zur HandleLabelsTextChanged-Methode. Wir könnten LabelsTextChanged direkt erhöhen. Die .NET Framework-Entwurfsrichtlinien sagen jedoch aus, dass es eine bewährte Methode ist, eine OnEventName-geschützte virtuelle Methode zu erstellen, um das Ereignis für uns zu wecken. Auf diese Weise kann das Erben von Klassen das Ereignis "handhaben", indem die OnEventName-Methode überschrieben wird. Dies hat sich als etwas bessere Leistung erwiesen als das Abonnieren des Ereignisses. Selbst wenn Sie der Meinung sind, dass Sie die OnEventName-Methode niemals überschreiben werden, ist es eine gute Idee, sich daran zu gewöhnen, es trotzdem zu tun, da dies den Ereigniserhöhungsprozess vereinfacht.

Hier ist unsere OnLabelsTextChanged:

protected virtual void OnLabelsTextChanged(EventArgs e)
{
    EventHandler handler = this.LabelsTextChanged;
    if (handler != null)
    {
        handler(this, e);
    }
}

Wir müssen auf null prüfen, da ein Ereignis ohne Abonnenten null ist. Wenn wir versuchen, ein Nullereignis auszulösen, würden wir eine NullReferenceException erhalten. Beachten Sie, dass wir die EventHandler des Ereignisses in eine lokale Variable kopieren, bevor Sie sie auf null prüfen und das Ereignis auslösen. Wenn wir es stattdessen so gemacht hätten:

if (this.LabelsTextChanged != null)
{
    this.LabelsTextChanged(this, e);
}

Wir hätten eine Wettlaufsituation zwischen der Nichtigkeitsprüfung und der Ereigniserhöhung. Wenn es gerade so war, dass sich die Abonnenten des Ereignisses kurz vor dem Auslösen des Ereignisses selbst abmeldeten, aber nachdem wir auf null überprüft haben, wird eine Ausnahme ausgelöst. Normalerweise werden Sie nicht auf dieses Problem stoßen, aber es ist am besten, sich daran zu gewöhnen, es auf die sichere Art und Weise zu schreiben.

Edit: So sollte die public event EventHandler LabelsTextChanged;-Zeile platziert werden:

namespace YourNamespace
{
    class MyUserControl : UserControl
    {
        // it needs to be here:
        public event EventHandler LabelsTextChanged;

        ...
    }
}

Hier sind die Rahmenentwurfsrichtlinien für das Design von Veranstaltungen zum weiteren Lesen.

51
Zach Johnson

Zuerst sollten Sie ein Ereignis in Ihrer Benutzerkontrolle deklarieren:

public event EventHandler TextOfLabelChanged;

dann müssen Sie die Callback-Funktion aufrufen, die in Runtime an Ihr Ereignis gebunden ist (sofern vorhanden). Sie können dies tun, indem Sie das TextChanged-Ereignis eines Labels wie folgt behandeln:

public void LabelTextChanged(object sender,EventArgs e)
{
if(TextOfLabelChanged!=null)
TextOfLabelChanged(sender,e);
}

Sie können Ihr eigenes EventArgs-Objekt haben, wenn Sie möchten.

irgendwo in Ihrem Code sollten Sie Ihr Label TextChanged-Ereignis wie folgt an diese Methode binden:

_myLabel.TextChanged+=LabelTextChanged;
3
Beatles1692

kompilierungsfehler, der besagt: "Erwartete Klasse, Delegat, Enumeration, Schnittstelle oder Struktur" in der zweiten Zeile scheint ein Problem mit "Ereignis ...".


Diese 2 Zeilen müssen INSIDE der Klassendeklaration sein.

public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;
1
Vince

Es gibt einen sehr einfachen Weg, das zu tun!

Im UserControl-Formular:

  1. Ändern Sie die Eigenschaften auf public, um überall darauf zugreifen zu können

auf dem Hauptformular, wo Sie UserControl verwenden:

.5: In der Region using fügen Sie using userControl1=UserControl.userControl1 hinzu.

1. Fügen Sie das Ereignis "Laod" zu Ihrem UserControl hinzu:

this.userControl1.Load += new System.EventHandler(this.userControl1_Load);

2.Im userControl1_Load:

private void userControl1_Load(object sender, EventArgs e)
{
     (sender as UserControl1).label1.TextChanged += label1_TextChanged; 
     //add a 'TextChanged' event to the label1 of UserControl1 
     OR use direct cast:
     ((UserControl1) sender).label1.TextChanged += label1_TextChanged;

}

3.Im label1_TextChanged:

 private void label1_TextChanged(object sender, EventArgs e)
 {
     //do whatever you want
 }
1
Arsalan

Sie müssen die Variable event und die Variable delegate innerhalb der Variable Namespace deklarieren. Versuchen Sie, den Code in den Bereich class zu bringen. Es wird gut laufen.

0
prem
public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;

// ...

protected void MyTextBox_TextChanged(object sender, EventArgs e)
{
    if (LabelTextChanged != null) {
        LabelTextChanged(this, e);
    }
}
0
thelost