using System;
 using System.Data;

 namespace DataColumnsApplication00
 {
 class DataTester
 {
 DataTable custTable;

 public void DTBuild()
 {
 custTable = new DataTable("Customers");
 // Добавляем столбики.
 custTable.Columns.Add("id", typeof(int));
 custTable.Columns.Add("name", typeof(string));

 // Определяем первичный ключ.
 custTable.Columns["id"].Unique = true;
 custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] };

 // Добавление события ColumnChanging handler для таблицы.
 custTable.ColumnChanging +=
              new DataColumnChangeEventHandler(Column_Changing);
 // Добавление события ColumnChanged event handler для таблицы. 
 custTable.ColumnChanged +=
             new DataColumnChangeEventHandler(Column_Changed);
 }

 public void RowsAdd(int id)
 {
 int x;
 // Добавляем строки.
 for (x = 0; x < id; x++)
 {
     custTable.Rows.Add(new object[] { x, string.Format("customer{0}", x) });
 }
 // Фиксируются все изменения, которые были произведены над таблицей
 // со времени последнего вызова AcceptChanges. 
 custTable.AcceptChanges();
 }

 public void RowsChange()
 {
 // Изменяем значение поля name во всех строках.
 foreach (DataRow row in custTable.Rows)
 {
     row["name"] = string.Format("vip{0}", row["id"]);
 }
 }

 // И после вмешательства результаты становятся известны
 // обработчику события Column_Changing. А толку-то...
 private static void Column_Changing
                   (object sender, DataColumnChangeEventArgs e)
 {
     Console.WriteLine
     ("Column_Changing Event: name={0}; Column={1}; proposed name={2}", 
                                  	e.Row["name"], 
                                  	e.Column.ColumnName,
                                  	e.ProposedValue);
 }

 // Аналогично устроен обработчик Column_Changed.
     private static void Column_Changed
            	(object sender, DataColumnChangeEventArgs e)
 {
     Console.WriteLine
     ("Column_Changed Event: name={0}; Column={1}; proposed name={2}",
           	e.Row["name"],
           	e.Column.ColumnName,
           	e.ProposedValue);
 }    
 }
 class Program
 {
  static void Main(string[] args)
  {
   DataTester dt = new DataTester();
    dt.DTBuild();
    dt.RowsAdd(10);
    dt.RowsChange();
   }
  }
 }

Листинг 18.2.
Закрыть окно