Lektsia_4VP
.pdfДелегаты и события
Добавление обработчика события
public partial class Form1 : Form
{
Person p; public Form1()
{
InitializeComponent(); p = new Person();
p.AgeChanged += new EventHandler(p_AgeChanged); // или p.AgeChanged += p_AgeChanged;
}
private void button1_Click(object sender, EventArgs e)
{
p.Age = (int)new Random((int)DateTime.Now.Ticks).Next(100);
}
void p_AgeChanged(object sender, EventArgs e)
{
MessageBox.Show("Изменился возраст. Стал="
+(sender as Person).Age.ToString());
}
}
Делегаты и события
События с передачей дополнительных параметров
Нужно расширить делегат EventHandler собственной реализацией
Создадим три дополнительных свойства:
NewName – строка, в которой хранится новое имя, которое мы хотим установить;
Canceled – если это свойство равно true, то изменения нельзя принимать; NameKind– тип изменяемого имени. Этот параметр является перечислением NameChangingKind, которое объявлено тут же в классе, и позволяет определить, что изменяется – имя или фамилия.
Делегаты и события
public class NameChangeEvent:EventArgs
{
public enum NameChangingKind { FirstName,LastName} public string NewName { get; set; }
public bool Canceled { get; set; }
public NameChangingKind NameKind { get; set; }
public NameChangeEvent(string newName, NameChangingKind nameKind)
{
NewName = newName; NameKind = nameKind; Canceled = false;
}
}
Делегаты и события
Как будем объявлять и использовать делегат?
// делегат
public delegate void NameChanged(Object sender, NameChangeEvent args); // объявление событий
public event NameChanged FirstNameChanged; public event NameChanged LastNameChanged;
Делегаты и события
public string FirstName
{
get { return _name; } set
{
if (FirstNameChanged!=null)
{
NameChangeEvent chevent = new NameChangeEvent(value, NameChangeEvent.NameChangingKind.FirstName);
FirstNameChanged (this, chevent); if (chevent.Canceled)
{
return;
}
}
_name=value;
}
}
Делегаты и события
Заодно вспомним про перегрузку методов
public override string ToString()
{
string result;
result = this._name + " "+ this._surname + " "+ this._age.ToString() + " лет."; return result;
}
Делегаты и события
Следующие две строки нужно добавить в конструктор формы, чтобы подписаться на обработку событий изменения имени и фамилии:
p.FirstNameChanged += new Person.NameChanged(p_FirstNameChanged); p.LastNameChanged += new Person.NameChanged(p_LastNameChanged);
Делегаты и события
Обработчик события изменения фамилии выглядит интересно:
void p_LastNameChanged(object sender, NameChangeEvent args)
{
if (MessageBox.Show("Попытка изменить фамилию с " +(sender as Person).LastName + " на " +args.NewName +
"\nПринять изменения?", "Внимание",
MessageBoxButtons.OKCancel)==DialogResult.Cancel)
{
args.Canceled = true;
}
}
Делегаты и события
Анонимные методы
p.AgeChanged += delegate(Object sender, EventArgs args)
{
Person person = (Person)sender;
MessageBox.Show("Возраст изменился на " + person.Age.ToString());
};
Делегаты и события