Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 1381

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

 

 

 

 

 

 

SetNull

Устанавливает

значение

указанного

DataColumn

на

 

нулевое.

 

 

 

 

Элементы этого набора являются объектами класса DataRow. В этом классе обеспечивается несколько вариантов реализации свойства Item, которые обеспечивают навигацию по множеству записей объекта DataTable, и сохранение текущих изменений данных, которые сделаны за текущий сеанс редактирования базы.

Посредством набора Rows реализуется возможность ссылки на любую запись таблицы. К любой записи можно обратиться напрямую, и потому не нужны методы позиционирования и перемещения по записям таблицы.

В примере используются различные варианты индексации. По множеству строк позиционирование проводится по целочисленному значению индекса. Выбор записи в строке производится по строковому значению, которое соответствует имени столбца.

Пример

private void PrintValues(DataTable myTable)

{

//Для каждой строки, которая входит в состав коллекции строк объекта таблицы… foreach(DataRow myRow in myTable.Rows)

{

//Для каждой ячейки (столбца) в строке…

foreach(DataColumn myCol in myTable.Columns)

{

// Выдать на консоль её значение! Console.WriteLine(myRow[myCol]);

}

}

}

Изменение данных в DataTable и состояние строки таблицы

Основной контроль за изменениями данных в таблице возлагается на строкиобъекты класса DataRow.

Для строки определены несколько состояний, которые объявлены в перечислении

RowState.

Контроль

за

сохраняемой

в

строках

 

таблицы

информацией

обеспечивается

посредством

определения

состояния

строки,

которое

обеспечивается одноименным (RowState) свойством-членом класса DataRow.

 

 

 

Описание

 

 

 

 

 

 

 

 

 

 

 

Состояние

 

 

 

 

 

 

 

 

 

 

 

Unchanged

Строка не изменялась со времени загрузки при помощи метода Fill(), либо с

 

момента вызова метода AcceptChanges().

 

 

 

 

 

 

 

Added

Строка была добавлена в таблицу,

но

метод

AcceptChanges()

ещё

не

 

вызывался.

 

 

 

 

 

 

 

 

 

 

 

Deleted

Строка была удалена из таблицы,

но

метод

AcceptChanges()

ещё

не

 

вызывался.

 

 

 

 

 

 

 

 

 

 

 

Modified

Некоторые из полей строки были изменены, но метод AcceptChanges() ещё не

 

вызывался.

 

 

 

 

 

 

 

 

 

 

 

Detached

Строка НЕ ЯВЛЯТСЯ ЭЛЕМЕНТОМ КОЛЛЕКЦИИ DataRows. Её создали от имени

 

таблицы, но не подключили

 

 

 

 

 

 

 

 

Пример. Создание таблицы, работа с записями

using System; using System.Data;

namespace Rolls01

{

///<summary>

///Работа с таблицей:

///определение структуры таблицы,

///сборка записи (строки таблицы),

///добавление новой записи в таблицу,

///индексация записей,

///выбор значения поля в строке,

216


///изменение записи.

///</summary>

public class RollsData

{

public DataTable rolls; int rollIndex;

public RollsData()

{

rollIndex = 0;

//Создаётся объект таблица. rolls = new DataTable("Rolls");

//Задаются и подсоединяются столбики, которые определяют тип таблицы.

//Ключевой столбец.

DataColumn dc = rolls.Columns.Add("nRoll",typeof(Int32)); dc.AllowDBNull = false;

dc.Unique = true; //rolls.PrimaryKey = dc;

//Прочие столбцы, значения которых определяют физические

//характеристики объектов. rolls.Columns.Add("Victim",typeof(Int32));

//Значения координат.

rolls.Columns.Add("X", typeof(Single)); rolls.Columns.Add("Y", typeof(Single));

//Старые значения координат. rolls.Columns.Add("lastX", typeof(Single)); rolls.Columns.Add("lastY", typeof(Single));

//Составляющие цвета. rolls.Columns.Add("Alpha", typeof(Int32)); rolls.Columns.Add("Red", typeof(Int32)); rolls.Columns.Add("Green", typeof(Int32)); rolls.Columns.Add("Blue", typeof(Int32));

}

// Добавление записи в таблицу. public void AddRow(int key,

int victim, float x, float y, float lastX, float lastY, int alpha, int red, int green, int blue)

{

//Новая строка создаётся от имени таблицы,

//тип которой определяется множеством ранее

//добавленных к таблице столбцов. Подобным образом

//созданная строка содержит кортеж ячеек

//соответствующего типа.

DataRow dr = rolls.NewRow();

//Заполнение ячеек строки. dr["nRoll"] = key; dr["Victim"] = victim; dr["X"] = x;

dr["Y"] = y; dr["lastX"] = lastX; dr["lastY"] = lastY; dr["Alpha"] = alpha; dr["Red"] = red; dr["Green"] = green; dr["Blue"] = blue;

//Созданая и заполненная строка

//подсоединяется к таблице.

217

rolls.Rows.Add(dr);

}

//Выбока значений очередной строки таблицы.

//Ничего особенного. Для доступа к записи (строке) используются

//выражения индексации по отношению к множеству Rows.

//Для доступа к полю выбранной записи используются

//"индексаторы-идентификаторы".

public void NextRow(ref rPoint p)

{

p.index = (int)rolls.Rows[rollIndex]["nRoll"]; p.victim = (int)rolls.Rows[rollIndex]["Victim"];

p.p.X = (float)rolls.Rows[rollIndex]["X"]; p.p.Y = (float)rolls.Rows[rollIndex]["Y"];

p.lastXdirection = (float)rolls.Rows[rollIndex]["lastX"]; p.lastYdirection = (float)rolls.Rows[rollIndex]["lastY"];

p.c.alpha = (int)rolls.Rows[rollIndex]["Alpha"]; p.c.red = (int)rolls.Rows[rollIndex]["Red"]; p.c.green = (int)rolls.Rows[rollIndex]["Green"]; p.c.blue = (int)rolls.Rows[rollIndex]["Blue"];

p.cp.alpha = p.c.alpha - 50; p.cp.red = p.c.red - 10; p.cp.green = p.c.green - 10; p.cp.blue = p.c.blue - 10;

rollIndex++; // Изменили значение индекса строки.

if (rollIndex == rolls.Rows.Count) rollIndex = 0;

}

// Та же выборка, но в параметрах дополнительно указан индекс записи. public void GetRow(ref rPoint p, int key)

{

p.index = (int)rolls.Rows[key]["nRoll"]; p.victim = (int)rolls.Rows[key]["Victim"];

p.p.X = (float)rolls.Rows[key]["X"]; p.p.Y = (float)rolls.Rows[key]["Y"];

p.lastXdirection = (float)rolls.Rows[key]["lastX"]; p.lastYdirection = (float)rolls.Rows[key]["lastY"];

p.c.alpha = (int)rolls.Rows[key]["Alpha"]; p.c.red = (int)rolls.Rows[key]["Red"]; p.c.green = (int)rolls.Rows[key]["Green"]; p.c.blue = (int)rolls.Rows[key]["Blue"];

p.cp.alpha = p.c.alpha - 50; p.cp.red = p.c.red - 10; p.cp.green = p.c.green - 10; p.cp.blue = p.c.blue - 10;

if (rollIndex == rolls.Rows.Count) rollIndex = 0;

}

//Изменяется значение координат и статуса точки.

//Значение порядкового номера объекта-параметра используется

//в качестве первого индексатора, имя столбца – в

//качестве второго. Скотрость выполнения операции присваивания

//значения ячейке оставляет желать лучшего.

public void SetXYStInRow(rPoint p)

{

rolls.Rows[p.index]["X"] = p.p.X; rolls.Rows[p.index]["Y"] = p.p.Y;

rolls.Rows[p.index]["lastX"] = p.lastXdirection; rolls.Rows[p.index]["lastY"] = p.lastYdirection;

218


rolls.Rows[p.index]["Victim"] = p.victim;

}

public void ReSetRowIndex()

{

rollIndex = 0;

}

}

}

Relations

Вклассе DataSet определяется свойство Relations - набор объектов-

представителей класса DataRelations. Каждый такой объект определяет связи между составляющими объект DataSet объектами DataTable (таблицами). Если в DataSet более одного набора DataTable, набор DataRelations будет содержать несколько объектов типа DataRelation. Каждый объект определяет связи между таблицами – DataTable. Таким образом, в DataSet реализован полный набор для управления данными, включая сами таблицы, ограничения и отношения между таблиц.

Constraints

Объекты-представители класса Constraint в наборе Constraints объекта DataTable позволяет задать на множестве объектов DataTable различные ограничения. Например, можно создать объект Constraint, гарантирующий, что значение поля или нескольких полей будут уникальны в пределах DataTable.

DataView

Объекты-представители класса DataView НЕ ПРЕДНАЗНАЧЕНЫ для организации визуализации объектов DataTable.

Их назначение – простой последовательный доступ к строкам таблицы. Объекты DataView являются средством перебора записей таблицы. При обращении ЧЕРЕЗ объект DataView к таблице получают данные, которые хранятся в этой таблице.

DataView нельзя рассматривать как таблицу. DataView не может обеспечить представление таблиц. Также DataView не может обеспечить исключения и добавления столбцов. Таким образом, DataView НЕ является средством преобразования исходной информации, зафиксированной в таблице.

После создания объекта DataView и его настройки на конкретную таблицу, появляется возможность перебора записей, их фильтрации, поиска, сортировки.

DataView предоставляет средства динамического представления набора данных, к которому можно применить различные вырианты сортировки и фильтрации на основе критериев, обеспечиваемых базой данных.

Класс DataView обладает большим набором свойств, методов и событий, что позволяет с помощью объекта-представителя класса DataView создавать различные представления данных, содержащихся в DataTable, a capability that is often used in data-binding applications.

Используя этот объект, можно представлять содержащиеся в таблице данные в соответствии с тем или иным порядком сортировки, а также можно организовать фильтрацию данных by row state или основанных на выражениях фильтрации.

A DataView предоставляет динамический взгляд на содержимое таблицы в зависимости от установленного в таблице порядка представления и вносимых в таблицы изменений.

Это отличается от метода Select, определённого в DataTable, который возвращает массив DataRow (строк).

Для управления установками представления для всех таблиц, входящих в DataSet, используется объект-представитель класса DataViewManager.

219


DataViewManager предоставляет удобный способ управления параметрами настройки представления умолчанию для каждой таблицы.

Примеры использования DataView

Для организации просмотра информации, сохраняемой объектом-представителем класса DataTable через объект-представитель класса DataView, этот объект необходимо связать с таблицей.

Таким образом, в приложении создаётся (независимый!) вьюер, который связывается с таблицей.

Итак, имеем:

DataTable tbl = new DataTable(“XXX”); // Объявлен и определён объект таблица. DataView vie; // Ссылка на вьюер.

vie = new DataView(); // Создали…

vie.Table = tbl; // Привязали таблицу к вьюеру. // Можно и так…

vie = new DataView(tbl); // Создали и сразу привязали…

Управление вьюером осуществляется посредством и различных достаточно простых манипуляций, включая изменение свойств объекта.

Например, сортировка включается следующим образом:

//Предполагается наличие кнопочных переключателей,

//в зависимости от состояния которых в свойстве Sort

//вьюера выставляется в качестве значения имя того или

//иного столбца. Результат сортировки становится виден

//непосредственно после передачи информации объекту,

//отвечающему за демонстрацию таблицы (rpDataGreed).

if (rBN.Checked) rd.view.Sort = "nRoll"; if (rBX.Checked) rd.view.Sort = "X";

if (rBY.Checked) rd.view.Sort = "Y";

this.rpDataGrid.DataSource = rd.view;

Следующий пример кода демонстрирует возможности поиска, реализуемые объектом-представителем класса DataView. Сортировка обеспечивается вариантами методов Find и FindRows, которые способны в различной реализации воспринимать отдельные значения или массивы значений.

Поиск информации проводится по столбцам, предварительно перечисленным в свойстве Sort. При неудовлетворительном результате поиска метод Find возвращает отрицательное значение, метод FindRows – нулевое.

В случае успеха метода Sort возвращается индекс первой найденной записи. По этому индексу можно получить непосредственный доступ к записи.

:::::

// Выставили значение индекса int findIndex = -1;

:::::

//Поиск в строке по полю "nRoll" (целочисленный столбец) rd.view.Sort = "nRoll";

try

{

//Проверка на соответствие типа. int.Parse(this.findTtextBox.Text);

//Сам поиск.

findIndex = rd.view.Find(this.findTtextBox.Text);

}

catch (Exception e1)

{

this.findTtextBox.Text = "Integer value expected...";

}

220