Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lektsia_4VP

.pdf
Скачиваний:
14
Добавлен:
27.05.2015
Размер:
146.03 Кб
Скачать

Делегаты и события

Добавление обработчика события

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());

};

Делегаты и события

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]