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

·  Поместив на форму компонент DataGridView, важно его идентифицировать. Дайте ему более короткое имя (например, grid) и задайте свойства: AlternatingBackColor, и другие, интуитивно понятные, свойства.

·  Добавьте в пространство имен PersonList новый класс Person (используйте команду AddClass).

·  Разработайте множество данных и свойств класса Person. Свойства нужны для работы механизма DataBinding.

·  В класс формы добавьте объявление коллекции типа BindingList<Person> с идентификатором list.

·  Создайте коллекцию и заполните ее ссылками на некоторые объекты класса Person.

·  Свяжите эту коллекцию с компонентом DataGridView.

Хочу обратить ваше внимание на то, что новый класс не следует вставлять в тот же файл, где расположен класс формы. Его следует поместить в отдельный файл, но в том же самом пространстве имен. Описание класса Person можно взять из проекта консольного типа (там был сходный класс Man), однако, в рамках данного проекта нам не понадобится значительная часть его функциональности. Компонент DataGridView снимает с нас заботы по вводу и выводу данных, поэтому класс Person будет иметь другую структуру данных, свойств и методов. Рассмотрим примерный список полей данных. Вы можете добавить свои поля, или скорректировать предлагаемые, но не упрощайте слишком сильно. Поле DateTime birth — обязательно, так как надо научиться работать с датами.

protected string name, phone, addr;

protected Gender gender;  // Пол персоны

protected DateTime birth;

string photoFile;

Bitmap photo;

static string photoFolder;

static int maxName = 25, maxAddr = 80;

Тип Gender (пол персоны) — это перечисление. Его следует задать вне класса, например, так:

public enum Gender : byte { NA, M, F }

Для успешной работы механизма DataBinding и компонента PropertyGrid в класс Person надо добавить свойства. Например:

  [XmlAttribute]

  public string Name

  {

    get { return name; }

    set

    {

      int i = value.IndexOf('\n');

      if (i < 0)

        i = value.Length;

      if (i > maxName)

        value = value.Substring(0, maxName);

      else if (i < 1)

        value = "N/A";

      name = value;

    }

  }

Атрибут [XmlAttribute] задает способ хранения поля name в XML-файле. Оно будет представлено атрибутом, а не элементом. Разработайте свойства для всех остальных полей класса. Добавьте свойство Age, которое будет вычисляться на основе поля birth, например:

  public float Age

  {

    get

    {

      if (birth == DateTime.MinValue)   // Это значение используется как флаг: дата неизвестна

        return 0;

      TimeSpan span = DateTime.Now - birth;

      return (float)Math.Round(span.Days / 365.25,1);

    }

  }

Тип float выбран для того, чтобы более точно отобразить данные о возрасте на графике (см. рис выше).

В класс формы добавьте обработчик события Load и вставьте вызов метода SetData, заполняющего коллекцию list.

void MainForm_Load(object sender, EventArgs e)

 {

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

}

Метод SetData должен заполнить коллекцию объектов и тем самым определить структуру компонента grid. Например:

void SetData ()

{

list = new BindingList<Man>();   // Коллекция ссылок

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

list.Add (new Person ("Anyukov", Gender.M, "2.01.1983"));

list.Add (new Person ("Andrew Arshavin", Gender.M, "26.02.1985", "511-7921", "Hi st., 20"));

// и т. д.

}

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

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

Запустите приложение и убедитесь, что в окне формы появляется таблица, которая содержит столбцы с заголовками тех свойств, которые объявлены в классе Person. Заголовки столбцов, как можно догадаться, были автоматически вычислены на основе данных класса Person. Если присмотреться внимательно, то можно увидеть, что имена столбцов соответствуют идентификаторам свойств класса, а не полей данных (name, birth, и т. д.). Поля начинаются со строчных букв, а свойства и методы с заглавных. Это — стандарт и его не следует нарушать.