Этот факт объясняет отсутствие в таблице столбцов с полями данных, которые не поддержаны свойствами (если такие есть). Для того, чтобы проверить догадку, достаточно ввести в класс еще одно скрытое поле данных, но не сопоставить ему 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, Text — lblName.
· Вручную добавьте в класс формы объявление элемента CurrencyManager cm; — синхронизатора текущей позиции.
· Измените метод MainForm_Load класса так, чтобы он произвел увязку трех объектов (grid, list и cm).
grid.DataSource = list; // Связывание коллекции с компонентом DataGridView
cm = (CurrencyManager)grid.BindingContext[list]; // Получаем ссылку на синхронизатор
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.