Файл: 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