· Поместив на форму компонент 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, и т. д.). Поля начинаются со строчных букв, а свойства и методы с заглавных. Это — стандарт и его не следует нарушать.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.