Исследование MS Visual С#, страница 23

¨  Класс Form1 содержит переменную components и стандартный набор методов. Методы класса Container управляют поведением компонетов.

¨  Список используемых пространств имен (директив using) оптимизирован и в него не следует включать те пространства, которые не используются приложением.

Рассмотрим, как работать с элементом управления DataGrid. Этот интерфейсный компонент значительно более удобен в использовании, чем стандартный ListBox. Он позволяет производить редактирование данных по месту их размещения. Он эффективен не только в нашем сценарии, но и в более сложных приложениях, например, при отображении данных, хранимых в таблице реляционной базы данных. Источник данных для DataGrid можно выбрать как на этапе компиляции, так и на этапе выполнения.

В памяти список будет хранится с помощью уже знакомой вам структуры данных, управляемой классом ArrayList, а его данные будут отбражаться в окне компонента, управляемого классом DataGrid. Пользователь редактирует данные в ячейках DataGrid, а изменения сохраняются в объекте класса ArrayList. Как и в случае с другими элементами управления (например, ListBox), библиотека .NET имеет два класса с именем DataGrid: один в пространстве имен Windows.Forms, а другой — в Web.UI.WebControls. Чтобы не спутать их, помните, что они расположены на разных вкладках окна Toolbox. Поместив на форму компонент DataGrid, полезно идентифицировать новый компонент, дав ему более короткое имя (например, grid) и задать ему некоторые свойства: AlternatingBackColor, CaptionText, BackgroundColor и т.д. Далее следует внести ряд изменений в класс формы:

¨  Добавить описание класса Man, коллекцию menList типа ArrayList.

¨  Заполнить коллекцию ссылками на некоторые объекты класса Man.

¨  Связать эту коллекцию с компонентом DataGrid.

Для того, чтобы вставить в пространство имен PeopleGrid новый класс Man можно воспользоваться мастером C# Class Wizard. Здесь я хочу обратить ваше внимание на то, что новый класс нельзя вставлять в пространство имен перед классом Form1. Его можно вставить после класса формы или в другой файл (сохранив тем же самым пространство имен). Тогда не будет проблем с видимостью имен. Описание класса Man можно взять из проекта консольного типа, однако, в рамках данного проекта нам не понадобится значительная часть его функциональности.

Компонент DataGrid снимает с нас заботы по вводу и выводу данных. Поэтому, используем более простой класс Man. Для иллюстрации важного момента в технологии управления DataGrid добавим в класс еще одно поле — номер телефона. Первоначально оно не поддержано свойством и это важно.

class Man

{

protected string name; // Старые данные

protected uint age;

protected string phone;     // Новое поле данных, не поддержанное свойством

public string Name      // Свойства

{

  get { return name; }

  set

  {

     int i = value.IndexOf('\n');      // Ищем признак конца строки

     if (i < 0)         // Если не нашли,

       i = value.Length;// то узнаем длину строки

     if (i > 25) // Укорачиваем слишком длинную строку

       value = value.Substring (25);

     else if (i < 1)  // Если строка оказалась пустой,

       value = "N/A";// имя не определено

     name = value;        // Присваиваем закрытой переменной новое значение

  }

}

public uint Age

{

  get { return age; }

  set

  {

     if (value < 150)

       age = value;

  }

}

public Man(string n, uint a, string ph)      // Конструктор класса

{

  Name = n;   Age = a;    phone = ph;

}

}

Класс ArrayList обладает универсальными возможностями и позволяет оперировать в памяти данными произвольного типа. Введите в класс формы объявление объекта этого типа.

  private ArrayList menList = new ArrayList();  // Коллекция ссылок

и вставьте в конструктор формы вызов метода, заполняющего коллекцию.

  public Form1()

  {

     InitializeComponent();

     MakeList();   // Начальное заполнение списка данных

  }

MakeList должен заполнить коллекцию объектов и, как будет показано ниже, определить структуру компонента grid.

private void MakeList()

{

  //==== Наполните коллекцию ссылками на людей (объекты класса Man)

}

Теперь привяжем (bind) компонент grid к коллекции menList. Для этого вставьте в конструктор формы следующую строку.

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

Запустите приложение и убедитесь, что в окне формы появляется таблица, которая содержит лишь два столбца с заголовками Age и Name. Заголовки столбцов, как можно догадаться, были автоматически вычислены на основе данных класса Man. Если присмотреться внимательно, то можно увидеть, что имена столбцов соответствуют идентификаторам свойств класса, а не полей данных (name, age), которые начинаются со строчных букв.

Это предположение объясняет еще один факт — отсутствие в таблице третьего столбца с номером телефона. Для того, чтобы проверить догадку, достаточно ввести в класс еще одно свойство Phone, которое управляет скрытым полем данных phone. Сделайте это и вновь запустите. Убедитесь, что на сей раз таблица содержит все три столбца данных.

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

1.  Откройте окно Form1.cs[Design] и переведите фокус в элемент DataGrid,

2.  Нажмите кнопку Events, которая расположена в верхней части окна свойств,

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

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

private void grid_CurrentCellChanged (object sender, EventArgs e)