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; } } }