Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 41

Этот факт объясняет отсутствие в таблице столбцов с полями данных, которые не поддержаны свойствами (если такие есть). Для того, чтобы проверить догадку, достаточно ввести в класс еще одно скрытое поле данных, но не сопоставить ему public-свойство. Сделайте это и убедитесь, что DataGridView (точнее, механизм DataBinding) отображает только свойства.

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

·  Откройте форму в режиме дизайна, добавьте на нее временный элемент типа TextBox с именем msg.

·  Установите его свойство Multiline = True.

·  Переведите фокус в элемент DataGridView, нажмите кнопку Events, которая расположена в верхней части окна свойств, отыщите в списке событий строку CurrentCellChanged, которая именует событие перехода фокуса из одной ячейки таблицы в другую, то есть смены активной (текущей) ячейки, и дважды щелкните над ней.

·  В классе MainForm появится функция обработки указанного события. Введите в нее следующий код:

  void grid_CurrentCellChanged (object sender, EventArgs e)

  {

    if (grid.CurrentCell != null)

    {

      msg.Text = "Cell: " + grid.CurrentCell.RowIndex + ", " + grid.CurrentCell.ColumnIndex;

      foreach (Person m in list) // Добавляем весь список имен для убедительности

        msg.Text += "\r\n" + m.Name;

    }

  }

Каждый раз, когда пользователь переводит фокус из одной ячейки в другую, управление передается в функцию обработки события CurrentCellChanged. Суть опыта в том, чтобы сделать видимыми изменения, происходящие в памяти (коллекции list). Сравните поведение компонента при стирании поля, управляемого свойством Birth с тем, которое обнаруживается при стирании поля, управляемого свойством Name, объясните различие и удалите обработчик события, так как он будет мешать в следующем опыте.

Покажем, что перемещение по ячейкам таблицы можно осуществлять не только с помощью мыши и клавиш управления курсором, но и с помощью специального элемента управления, называемого CurrencyManager. Для управления объектами класса CurrencyManager оконная форма может пользоваться объектом специального класса BindingContext.

В настоящий момент источником данных таблицы является объект класса BindingList. Он не имеет свойства Current, то есть не умеет отслеживать свою текущую позицию. Чтобы добиться этого, надо связать три сущности: элемент типа CurrencyManager, компонент DataGridView и элемент типа BindingList.

В пространстве имен System.Windows.Forms определен класс BindingManagerBase. Он является абстрактным, но имеет два производных класса: CurrencyManager и PropertyManager, которые позволяют синхронизировать позиции и состояния отдельных элементов управления на оконной форме, привязанных к одному и тому же источнику данных. Для иллюстрации возможностей класса CurrencyManager:

·  Вставьте в ToolStrip четыре кнопки управления текущей позицией таблицы grid, которая будет синхронизирована с текущей позицией списка list. Установите для них имена (свойства (Name)): btnFirst, btnPrev, btnNext, btnLast, а также значения свойств Text: First, Prev, Next, Last Для всех кнопок установите изображения (команда Set Image контекстного меню), как показано ниже.

   

·  Для всей панели ToolStrip добавьте обработчик события ItemClicked.

·  Для отображения текущего элемента списка введите в форму элемент типа Label и установите его свойства: (Name) — lblName, TextlblName.

·  Вручную добавьте в класс формы объявление элемента CurrencyManager cm; — синхронизатора текущей позиции.

·  Измените метод MainForm_Load класса так, чтобы он произвел увязку трех объектов (grid, list и cm).

    grid.DataSource = list; // Связывание коллекции с компонентом DataGridView

             cm = (CurrencyManager)grid.BindingContext[list];  // Получаем ссылку на синхронизатор