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.
Закрыть окно