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