using System;
 using System.Data;

 namespace DataRowsApplication00
 {
 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"] };

 // Добавляем RowChanging event handler для нашей таблицы.
 custTable.RowChanging += new DataRowChangeEventHandler(Row_Changing);
 // Добавляем a RowChanged event handler для нашей таблицы.
 custTable.RowChanged += new DataRowChangeEventHandler(Row_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 во всех строках.
 // Все имена убираются, а на их место
 // подставляется буквосочетание, состоящее из
 // префикса vip и старого значения строки каждого клиента.
 // Была строка customer5 – стала vip customer5.

 foreach (DataRow row in custTable.Rows)
 {
     row["name"] = string.Format("vip {0}", row["id"]);
 }

 }

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

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

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