Создание таблиц и внедрение их в DataSet — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Создание таблиц и внедрение их в DataSet

2022-09-11 28
Создание таблиц и внедрение их в DataSet 0.00 из 5.00 0 оценок
Заказать работу

Сейчас в набор данных 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. Механизм привязки к данным (Data Binding) задействован двумя операторами. Такой способ привязки (коллекции к коллекции) называется 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 (перед кодом привязки к таблице).

· Запустите приложение и проверьте результат.

Пояснения

· В методе AddStyle мы управляем множеством колонок таблицы, которые отображает grid, а также компонентами его стиля. Здесь опять главную роль играет механизм DataBinding (привязка одного свойства к другому), он включается оператором col.DataPropertyName = dc.ColumnName;.

· Индекс таблицы DataSet, которая отображается текущим grid передается параметром. Мы используем его для выбора нужной таблицы, а также для смены цвета фона перемежающихся строк (AlternatingRows).

· Заметьте, что для колонки Credit (зачет) вместо объекта DataGridViewTextBoxColumn, мы используем объект класса DataGridViewCheckBoxColumn. Найдите в MSDN справку по всем классам, производным от DataGridViewColumn, и проанализируйте их функциональность. Среди них нет класса CalendarColumn (мы добавили его вручную).

Довольно часто некоторые поля данных надо скрыть, не отображать их на форме (например, поля первичных автоинкрементируемых ключей). Для этого просто не включайте эти поля в множество колонок (объектов DataGridViewColumn), которое добавляется в DataGridView (см. код grid.Columns.Add(col);). В данный момент вы можете добавить код, генерирующий данные таблицы экзаменов, и привязать к ней второй grid (gridExam).

Запись и чтение данных

Класс DataSet значительно упрощает операции записи и чтения данных. Он имеет множество встроенных свойств и методов, поддерживающих управление данными в формате XML. Начнем с метода записи данных WriteXml.

void Save(string fn)

{

if (fn!= null && ds.Tables[0].Rows.Count!= 0)

{

ds.WriteXml(fn);

SetPath(fn);

}

}

Метод SetPath корректирует значения переменных dirName и fileName.

void SetPath(string fn)

{

Text = fn;

dirName = Path.GetDirectoryName(fn);

fileName = Path.GetFileName(fn);

}

Имя файла fn получим от пользователя с помощью метода FileDlg.

string FileDlg(bool bOpen)

{

FileDialog dlg = bOpen? (FileDialog)new OpenFileDialog(): (FileDialog)new SaveFileDialog();

dlg.InitialDirectory = dirName;

dlg.Filter = "XML files (*.xml)|*.xml";

dlg.FileName = fileName;

return dlg.ShowDialog() == DialogResult.OK? dlg.FileName: null;

}

Для обеспечения видимости классов попросите студию вставить недостающие директивы using. Чтение набора данных ds из XML-файла выполним в методе Open.

void Open(string fn)

{

if (fn!= null)

{

ds.Clear();

ds.ReadXml(fn);

SetPath(fn);

ds.AcceptChanges();

}

}

Отметьте, что при чтении данных из файла DataSet рождается заново, поэтому старые данные необходимо уничтожить (см. вызов Clear). Создайте папку Data, запустите приложение и сохраните данные в файле Studs.xml. Теперь можно закомментировать строку вызова InitTables и проверить поведение приложения при открытии файла с данными.


Поделиться с друзьями:

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.021 с.