using System;
using System.Data;
namespace Rolls01
{
// Работа с таблицей:
// определение структуры таблицы,
// сборка записи (строки таблицы),
// добавление новой записи в таблицу,
// индексация записей,
// выбор значения поля в строке,
// изменение записи.
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;
// Созданная и заполненная строка
// подсоединяется к таблице.
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;
rolls.Rows[p.index]["Victim"] = p.victim;
}
public void ReSetRowIndex()
{
rollIndex = 0;
}
}
} |
Листинг 18.3. |
| Закрыть окно |