- •В ведение в ado.Net
- •Потребитель данных
- •Поставщики данных
- •Источник данных — xml-файл
- •Элементы управления на форме Меню
- •Как устроены планки меню, статуса и панелей инструментов
- •Планка инструментов (ToolStrip)
- •Навигатор связей
- •Контейнер, расщепляющий форму
- •Создание таблиц и внедрение их в DataSet
- •Пояснения
- •Запись и чтение данных
- •Отображение данных связанной таблицы
- •Добавляем ограничение
- •Вторая, подчиненная таблица
- •Автоматическая навигация по записям связанной таблицы
- •Элемент управления BindingNavigator
- •Реакции на события в DataTable
- •Канонизация имен студентов
- •Вычисляемые колонки DataTable (Expression-Based DataColumn Objects)
- •Поиск в таблице DataTable и в компоненте DataGridView
- •Коррекция пользовательского интерфейса
- •Результат поиска
- •Поиск в DataGridView
- •Отбор данных из DataTable и отображение их в ListView
- •Как легко вносятся ошибки
- •Образ таблицы DataView
- •Методы Find и FindRows класса DataView
- •Задание
- •Элемент управления, который позволяет управлять отображением колонок DataGridView
Создание таблиц и внедрение их в DataSet
Сейчас в набор данных DataSet мы программным способом введем две таблицы: Studs и Exams и заполним их данными. На этапе выполнения пользователь сможет дополнить таблицы произвольными данными, затем сохранить весь набор в файле XML-формата (мы реализуем этот сценарий чуть позже). Перечисленные действия удобно выполнить в отдельном методе.
void InitDataSet()
{
ds = // Создайте источник данных (аналог базы данных) DataSet с именем "StudentsSet" или вовсе без имени
DataTable studs = ds.Tables.Add("Studs");// Создание таблицы данных с именем "Studs"
SetPrimaryColumn(studs); // Этот метод создадим позже
//======= Определяем схему таблицы
studs.Columns.Add ("Name"); // Добавляем колонку "Имя студента"
//==== Добавьте колонки Phone и Addr
// Создайте вторую таблицу с именем "Exams"
// Она должна иметь такой набор полей:
// ID (primary key). Вызовите вспомогательный метод SetPrimaryColumn (см. ниже)
// StudID (foreign key) (типа int), Course - имя курса лекций, Credit (зачет - незачет), Mark - оценка за экзамен (типа byte), Date - дата сдачи экзамена
}
При создании колонок для хранения данных типа, отличного от string, удобно пользоваться другой версией метода Add, например:
exams.Columns.Add("StudID", typeof(int));
Колонки первичных ключей обеих таблиц удобно добавить с помощью вспомогательного метода.
void SetPrimaryColumn(DataTable table)
{
DataColumn dc = table.Columns.Add("ID", typeof(int));
// Установите значения для следующих свойств колонки dc: AutoIncrement, AutoIncrementSeed, ReadOnly
table.PrimaryKey = new DataColumn[] { dc };
}
Код привязки первого компонента DataGridView к данным таблицы студентов добавьте внутрь метода RelateAndBind.
// Привязка DataGridView к данным DataSet. Включаем механизм DataBinding
gridStud.DataSource = ds;
gridStud.DataMember = ds.Tables[0].TableName; // Настройка механизма DataBinding
Если заполнить строки таблицы студентов (для этого следует написать код метода InitTables), то компонент DataGridView отобразит их на экране. Напомним, что DataSet и, вложенные в него объекты DataTable хранятся в памяти, а gridStud отображает данные таблицы студентов на экране. Важным моментом является привязка DataGridView к данным одной из таблиц DataSet. Механизм привязки к данным (DataBinding) задействован двумя операторами. Такой способ привязки (коллекции к коллекции) называется Complex DataBinding, в отличие от Simple DataBinding, когда одно значение (свойство) привязывается к другому значению (свойству). Заметьте, что оба способа привязки к данным требуют задать имена связываемых свойств (или имена таблиц, или имена более сложных сущностей).
Добавьте еще один вспомогательный метод, который сэкономит ваше время на заполнение таблиц данными.
void InitTables()
{
object[] studs = {
new object[] {1, "Charlie Parker", "123-4455", "Broadway, 52a"},
new object[] {2, "Alex Black", "555-1122", "5-th Avenue, 74" },
new object[] {3, "Andy Williams", "430-5125", "Back st., 22" },
new object[] {4, "Charley Mingus", "230-1466", "Hi st., 30" },
new object[] {5, "Chet Baker", "320-8656", "Howard st., 15" },
new object[] {6, "Lou Rowles", "552-4233", "Basin st., 10" },
};
foreach (object[] o in studs)
ds.Tables[0].Rows.Add(o);
}
Запустите приложение и проверьте его работу в режиме ввода и редактирования данных.
Добавьте метод, который изменяет облик DataGridView путем установки стилей отдельных колонок а также общих компонентов стиля, действующих на все ячейки.
void AddStyle(DataGridView grid, int tableID)
{
// Установите свойство AutoGenerateColumns для объекта grid
DataColumnCollection cols = // Добудьте ссылку на множество колонок таблицы с индексом tableID
foreach (По всем колонка таблицы)
{
DataGridViewColumn col = null;
if (dc.DataType == typeof(bool))
col = new DataGridViewCheckBoxColumn();
else if (dc.DataType == typeof(DateTime))
{
col = new CalendarColumn();
col.DefaultCellStyle.Format = "d";
}
else if (dc.DataType == typeof(decimal))
{
col = new DataGridViewTextBoxColumn();
col.DefaultCellStyle.Format = "f2";
}
else if (dc.ColumnName == "Course")
{
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
combo.DataSource = courses;
col = combo;
}
else if (dc.ColumnName == "Mark")
{
dc.DefaultValue = (byte)2;
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
combo.DataSource = new byte[] { 2, 3, 4, 5 };
col = combo;
}
else
col = new DataGridViewTextBoxColumn();
col.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
if (dc == cols[cols.Count - 1])
col.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
col.DataPropertyName = dc.ColumnName;
col.HeaderText = dc.ColumnName;
grid.Columns.Add(col);
}
grid.DefaultCellStyle.SelectionBackColor = Color.LightSteelBlue;
grid.DefaultCellStyle.SelectionForeColor = Color.Black;
grid.AlternatingRowsDefaultCellStyle.BackColor =
tableID == 0 ? Color.Wheat : Color.FromArgb(200, 255, 200);
}
Добавьте в проект файл с классами: CalendarControl, CalendarCell, CalendarColumn. Код классов был приведен в документе "C# Практика" в прошлом семестре. Класс CalendarColumn определяет тип колонок для отображения дат. Форматирование колонки с датой экзамена задается оператором: col.DefaultCellStyle.Format = "d";. Это позволяет убрать вывод времени и оставить только дату.
Вызовите метод AddStyle(gridStud, 0); в методе RelateAndBind (перед кодом привязки к таблице).
Запустите приложение и проверьте результат.
