Как реализована обработка событий в C #? - PullRequest
2 голосов
/ 28 марта 2012

Когда вы обновляете DataGridView.DataSource с помощью оператора присваивания, вызывается обработчик события DataSourceChanged.Вы не можете перегрузить оператор присваивания в C #, так как обработчик события вызывается внутри?

public void foo(){
    this.dataGridView.DataSourceChanged += new EventHandler(bar);
    this.dataGridView.DataSource = dt;
}

//this handler is called after datasource changes
private void bar(object sender, EventArgs e) {}

Ответы [ 5 ]

7 голосов
/ 28 марта 2012

DataSource реализовано как свойство.

private object _dataSource;
public object DataSource {
    get
    {
        return _dataSource;
    }
    set
    {
        if (value != _dataSource) {
            _dataSource = value;
            UpdateTheDataGridView();
            RaiseTheDataSourceChangedEvent();
        }
    }
}

Свойство чтения / записи - это набор из двух методов, которые автоматически вызываются при доступе к свойству; set при назначении значения, get при чтении свойства.

Обратите внимание, что изменение регистрируется только в том случае, если вы назначаете источнику данных что-то другое. Это означает, что вы не можете обновить сетку, переназначив один и тот же источник данных.

var list = new List<string> { "a", "b", "c" };
dgv.DataSource = list;

list.Add("d");
dgv.DataSource = list; // Does not work.

Обход:

list.Add("d");
dgv.DataSource = null; // <== this does the trick.
dgv.DataSource = list;
6 голосов
/ 28 марта 2012

Не совсем понятно, о чем вы спрашиваете.Если вы спрашиваете, как установщик свойств может что-то сделать: установщик свойств - это метод.Это работает как любой другой метод.В этом случае, когда вызывается установщик свойства, он проверяет, нужно ли ему инициировать событие, и если это так, то вызывает событие.

Если вы спрашиваете, как реализовано само событиеСтатья Джона, конечно, превосходна.Если вы ищете дополнительный технический анализ того, как события реализуются в C #, и как реализация менялась с течением времени, посмотрите статьи блога Криса Берроуза на эту тему:

http://blogs.msdn.com/b/cburrows/archive/tags/events/

Начните снизу.

Крис был разработчиком, который разработал и внедрил множество изменений в семантический анализ и генерацию кода компилятора.

6 голосов
/ 28 марта 2012

Это зависит от события точно , что оно делает, но я думаю о событиях как о свойствах - за исключением того, что вместо метода получения и установки у вас есть действия add и remove, каждое из которыхкоторые принимают делегата для подписки или отмены подписки на событие.

A похожее на поле событие в C # реализует событие, используя поле для делегата, и исправляет реализации добавления / удаления -немного похоже на автоматически реализованное свойство.Но вы можете делать все что угодно в обработчике add или remove.

См. Мою статью о делегатах и ​​событиях для получения дополнительной информации.

Что касаетсясам источник данных - это не присвоение поля - это присвоение свойству , так что, опять же, он может делать все, что захочет, в том числе вызывать событие DataSourceChanged.

0 голосов
/ 28 марта 2012

Источник данных - это свойство, и в наборе вызывается обработчик события.

Вы можете использовать ilspy, чтобы увидеть, как это на самом деле реализовано.

0 голосов
/ 28 марта 2012

Обработчик события вызывается изнутри, потому что класс, предоставляющий событие, в данном случае DataGridView явно запускает событие в некоторой точке своего кода.Установщик свойств для DataSource звучит как подходящее место для запуска этого конкретного события, хотя я не искал в его исходном коде точной проверки.

Я бы посоветовал поискать простое руководство о том, какпредоставить собственное мероприятие для другого класса.Это даст вам лучшее представление о том, как должен работать провайдер мероприятия без лишних мелких деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...