Winforms Bubbling Events - PullRequest
       0

Winforms Bubbling Events

0 голосов
/ 07 февраля 2012

Я хочу передать событие из класса в пользовательский контроль пользователя. Мой Usercontrol - это в основном таблица данных.

Sheet
  -> List<Row> Rows
   ->List<Cell> Cells

В моем UC (Sheet) есть список строк (класс), в каждой строке есть список ячеек (класс). У меня вопрос .. Как я могу поднять событие из ячейки, которую лист может поймать?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

В WinForms на самом деле невозможно всплыть события, поэтому вам, вероятно, понадобится некоторая функциональность на уровне листа, чтобы добавить / удалить строку или ячейку.

Сделав это на листе, вы будетевозможность подписываться / отменять подписку на события из ячеек при их создании / удалении, а также может скрывать внутреннюю структуру / процесс создания листа от потребителей:

public class Sheet
{
    ....

    public void AddRow(object[] values)
    {
        var row = new Row();
        foreach(var val in values) 
        {
           var cell = new Cell(val);
           cell.CellChanged += MyCellChangedHandler;
        }
    }
}

public class Cell
{
    ....

    public Cell(object value)
    {
        var eventProvider = value as IMyEventProvider; //can be anything you want, INotifyPropertyChanges?
        if (eventProvider != null)
            eventProvider.SomeEvent += SomeEventHandler;
    }

    public SomeEventHandler(...)
    {
        if (CellChanged != null) CellChanged(...);
    }
}

Таким образом вы будете избегать, чтобы ячейки знали о листах.и как вызывать листы и какие методы и т. д. (это явно не их касается), ячейки просто вызывают события, когда они изменяются, если кто-то слушает (лист), им все равно.

0 голосов
/ 07 февраля 2012

Ваши ячейки могут вызвать событие на листе, если они знают о листе. Например:

{
   ... some code ...
   Sheet.RaiseCellChanged(this.CellId);
}

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

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

EDIT: Чтобы ответить на ваш дополнительный вопрос, с точки зрения производительности не будет никакой разницы. Код было бы легче написать с использованием первого подхода, просто потому, что ваш Лист - или любой другой объект - должен был бы подписаться только на одно событие, чтобы получать данные из любой изменяющейся ячейки (при условии, что это именно то, что вы хотите) .

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