개체는 DataTable 애플리케이션에서 처리할 수 있는 일련의 이벤트를 제공합니다. 다음 표에서는 이벤트를 설명합니다 DataTable .
| 이벤트 | 설명 |
|---|---|
| Initialized |
EndInit의 메서드DataTable가 호출된 후에 발생합니다. 이 이벤트는 주로 디자인 타임 시나리오를 지원하기 위한 것입니다. |
| ColumnChanged | DataColumn 내에서 값이 성공적으로 변경된 후에 발생합니다. |
| ColumnChanging |
DataColumn에 값이 제출되었을 때 발생합니다. |
| RowChanged |
DataColumn의 RowState에서 DataRow 또는 DataTable 값이 성공적으로 변경된 후에 발생합니다. |
| RowChanging |
DataColumn에 있는 RowState의 DataRow 값이나 DataTable에 변경 내용이 제출되었을 때 발생합니다. |
| RowDeleted |
DataRow에 있는 DataTable이 Deleted으로 표시된 후에 발생합니다. |
| RowDeleting |
DataRow가 DataTable에서 Deleted로 표시되기 전에 발생합니다. |
| TableCleared |
Clear 메서드 호출이 모든 DataTable를 성공적으로 지운 후 DataRow에서 발생합니다. |
| TableClearing | 메서드가 호출된 후에 Clear, 작업이 시작되기 전에 Clear 발생합니다. |
| TableNewRow |
DataRow의 NewRow 메서드를 호출하여 새 DataTable가 생성된 후에 발생합니다. |
| Disposed |
DataTable가 Disposed일 때 발생합니다.
MarshalByValueComponent에서 상속됩니다. |
비고
행을 추가하거나 삭제하는 대부분의 작업은 ColumnChanged 및 ColumnChanging 이벤트를 발생시키지 않습니다. 그러나 ReadXml이 ColumnChanged로 설정되어 있거나 ColumnChanging로 설정되어 있지 않으면, XML 문서를 읽는 XmlReadMode인 경우 이 메서드는 DiffGram 및 Auto 이벤트를 발생시킵니다.
경고
데이터가 DataSet 이벤트가 발생하는 RowChanged 내에서 수정되는 경우 데이터 손상이 발생할 수 있습니다. 이러한 데이터 손상이 발생하면 예외가 발생하지 않습니다.
추가 관련 이벤트
속성은 Constraints 인스턴스를 보유합니다 ConstraintCollection .
ConstraintCollection 클래스는 CollectionChanged 이벤트를 제공합니다. 이 이벤트는 제약 조건이 추가, 수정 또는 제거될 ConstraintCollection때 발생합니다.
속성은 Columns 인스턴스를 보유합니다 DataColumnCollection .
DataColumnCollection 클래스는 CollectionChanged 이벤트를 제공합니다. 이 이벤트는 DataColumn에서 DataColumnCollection가 추가되거나 수정 또는 제거될 때 발생합니다. 이벤트를 발생시키는 수정에는 열의 이름, 데이터 타입, 식 또는 서수 위치의 변경이 포함됩니다.
Tables의 DataSet 속성은 DataTableCollection 인스턴스를 보유합니다. 클래스는 DataTableCollection와 CollectionChanged 이벤트 및 CollectionChanging 이벤트를 모두 노출합니다.
DataTable가 DataSet에 추가되거나 DataSet에서 제거될 때 이러한 이벤트가 발생합니다.
변경 사항은 DataRows에 연결된 DataView 이벤트를 트리거할 수도 있습니다. 이 클래스는 DataView 값이 변경되거나 뷰의 구성 또는 정렬 순서가 변경되면 발생하는 ListChanged 이벤트를 노출합니다. 관련된 DataRowView 값이 변경될 때 발생하는 이벤트를 노출하는 PropertyChanged 클래스가 있습니다.
작업 시퀀스
다음은 추가, 수정 또는 삭제될 때 DataRow 발생하는 작업 시퀀스입니다.
제안된 레코드를 만들고 변경 내용을 적용합니다.
비공식 열에 대한 제약 조건을 확인합니다.
RowChanging또는RowDeleting이벤트를 적절한 경우 발생시킵니다.제안된 레코드를 현재 레코드로 설정합니다.
연결된 인덱스를 업데이트합니다.
연결된
ListChanged개체에 대한DataView이벤트 및 연결된PropertyChanged개체에 대한DataRowView이벤트를 발생시킵니다.식 열을 모두 평가하되, 이들 열에 대한 제약 조건 검사는 나중에 진행합니다.
연산 열 평가의 영향을 받는
ListChanged연결된 개체에 대해DataView이벤트를 발생시키고,PropertyChanged연결된 개체에 대해DataRowView이벤트를 발생시키십시오.해당하는 경우
RowChanged또는RowDeleted이벤트를 발생시킵니다.식 표현 열에 대한 제약 조건을 확인합니다.
비고
식 열을 변경해도 DataTable 이벤트는 발생하지 않습니다. 식 열 변경은 DataView 및 DataRowView 이벤트만 발생시킵니다. 수식 열은 여러 다른 열에 종속될 수 있으며 단일 DataRow 작업 중에 여러 번 평가될 수 있습니다. 각 식 계산은 이벤트를 발생시키고, 식 열이 영향을 받을 때 단일 DataRow 연산이 여러 ListChanged 개와 PropertyChanged 이벤트를 발생시킬 수 있으며, 동일한 식 열에 대한 여러 이벤트를 포함할 수 있습니다.
경고
NullReferenceException를 RowChanged 이벤트 처리기 내에서 던지지 마세요.
NullReferenceException 이벤트의 RowChanged 내에서 DataTable이(가) 발생하면 DataTable이(가) 손상됩니다.
예시
다음 예제에서는 RowChanged, RowChanging, RowDeleted, RowDeleting, ColumnChanged, ColumnChanging, TableNewRow, TableCleared 및 TableClearing 이벤트에 대한 이벤트 처리기를 만드는 방법을 보여 줍니다. 각 이벤트 처리기는 실행 시 콘솔 창에 출력을 표시합니다.
static void DataTableEvents()
{
DataTable table = new("Customers");
// Add two columns, id and name.
table.Columns.Add("id", typeof(int));
table.Columns.Add("name", typeof(string));
// Set the primary key.
table.Columns["id"].Unique = true;
table.PrimaryKey = [table.Columns["id"]];
// Add a RowChanged event handler.
table.RowChanged += Row_Changed;
// Add a RowChanging event handler.
table.RowChanging += Row_Changing;
// Add a RowDeleted event handler.
table.RowDeleted += Row_Deleted;
// Add a RowDeleting event handler.
table.RowDeleting += Row_Deleting;
// Add a ColumnChanged event handler.
table.ColumnChanged += Column_Changed;
// Add a ColumnChanging event handler.
table.ColumnChanging += Column_Changing;
// Add a TableNewRow event handler.
table.TableNewRow += Table_NewRow;
// Add a TableCleared event handler.
table.TableCleared += Table_Cleared;
// Add a TableClearing event handler.
table.TableClearing += Table_Clearing;
// Add a customer.
DataRow row = table.NewRow();
row["id"] = 1;
row["name"] = "Customer1";
table.Rows.Add(row);
table.AcceptChanges();
// Change the customer name.
table.Rows[0]["name"] = "ChangedCustomer1";
// Delete the row.
table.Rows[0].Delete();
// Clear the table.
table.Clear();
}
static void Row_Changed(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Changed Event: name={e.Row["name"]}; action={e.Action}");
static void Row_Changing(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Changing Event: name={e.Row["name"]}; action={e.Action}");
static void Row_Deleted(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Deleted Event: name={e.Row["name", DataRowVersion.Original]}; action={e.Action}");
static void Row_Deleting(object sender,
DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Deleting Event: name={e.Row["name"]}; action={e.Action}");
static void Column_Changed(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine($"Column_Changed Event: ColumnName={e.Column.ColumnName}; RowState={e.Row.RowState}");
static void Column_Changing(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine($"Column_Changing Event: ColumnName={e.Column.ColumnName}; RowState={e.Row.RowState}");
static void Table_NewRow(object sender,
DataTableNewRowEventArgs e) =>
Console.WriteLine($"Table_NewRow Event: RowState={e.Row.RowState.ToString()}");
static void Table_Cleared(object sender, DataTableClearEventArgs e) =>
Console.WriteLine("Table_Cleared Event: TableName={0}; Rows={1}",
e.TableName, e.Table.Rows.Count.ToString());
static void Table_Clearing(object sender, DataTableClearEventArgs e) =>
Console.WriteLine("Table_Clearing Event: TableName={0}; Rows={1}",
e.TableName, e.Table.Rows.Count.ToString());
Private Sub DataTableEvents()
Dim table As New DataTable("Customers")
' Add two columns, id and name.
table.Columns.Add("id", Type.GetType("System.Int32"))
table.Columns.Add("name", Type.GetType("System.String"))
' Set the primary key.
table.Columns("id").Unique = True
table.PrimaryKey = New DataColumn() {table.Columns("id")}
' Add a RowChanged event handler.
AddHandler table.RowChanged, _
New DataRowChangeEventHandler(AddressOf Row_Changed)
' Add a RowChanging event handler.
AddHandler table.RowChanging, _
New DataRowChangeEventHandler(AddressOf Row_Changing)
' Add a RowDeleted event handler.
AddHandler table.RowDeleted, New _
DataRowChangeEventHandler(AddressOf Row_Deleted)
' Add a RowDeleting event handler.
AddHandler table.RowDeleting, New _
DataRowChangeEventHandler(AddressOf Row_Deleting)
' Add a ColumnChanged event handler.
AddHandler table.ColumnChanged, _
New DataColumnChangeEventHandler(AddressOf Column_Changed)
' Add a ColumnChanging event handler for the table.
AddHandler table.ColumnChanging, New _
DataColumnChangeEventHandler(AddressOf Column_Changing)
' Add a TableNewRow event handler.
AddHandler table.TableNewRow, New _
DataTableNewRowEventHandler(AddressOf Table_NewRow)
' Add a TableCleared event handler.
AddHandler table.TableCleared, New _
DataTableClearEventHandler(AddressOf Table_Cleared)
' Add a TableClearing event handler.
AddHandler table.TableClearing, New _
DataTableClearEventHandler(AddressOf Table_Clearing)
' Add a customer.
Dim row As DataRow = table.NewRow()
row("id") = 1
row("name") = "Customer1"
table.Rows.Add(row)
table.AcceptChanges()
' Change the customer name.
table.Rows(0).Item("name") = "ChangedCustomer1"
' Delete the row.
table.Rows(0).Delete()
' Clear the table.
table.Clear()
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row_Changed Event: name={0}; action={1}", _
e.Row("name"), e.Action)
End Sub
Private Sub Row_Changing(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row_Changing Event: name={0}; action={1}", _
e.Row("name"), e.Action)
End Sub
Private Sub Row_Deleted(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row_Deleted Event: name={0}; action={1}", _
e.Row("name", DataRowVersion.Original), e.Action)
End Sub
Private Sub Row_Deleting(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row_Deleting Event: name={0}; action={1}", _
e.Row("name"), e.Action)
End Sub
Private Sub Column_Changed(ByVal sender As Object, _
ByVal e As DataColumnChangeEventArgs)
Console.WriteLine("Column_Changed Event: ColumnName={0}; RowState={1}", _
e.Column.ColumnName, e.Row.RowState)
End Sub
Private Sub Column_Changing(ByVal sender As Object, _
ByVal e As DataColumnChangeEventArgs)
Console.WriteLine("Column_Changing Event: ColumnName={0}; RowState={1}", _
e.Column.ColumnName, e.Row.RowState)
End Sub
Private Sub Table_NewRow(ByVal sender As Object, _
ByVal e As DataTableNewRowEventArgs)
Console.WriteLine("Table_NewRow Event: RowState={0}", _
e.Row.RowState.ToString())
End Sub
Private Sub Table_Cleared(ByVal sender As Object, _
ByVal e As DataTableClearEventArgs)
Console.WriteLine("Table_Cleared Event: TableName={0}; Rows={1}", _
e.TableName, e.Table.Rows.Count.ToString())
End Sub
Private Sub Table_Clearing(ByVal sender As Object, _
ByVal e As DataTableClearEventArgs)
Console.WriteLine("Table_Clearing Event: TableName={0}; Rows={1}", _
e.TableName, e.Table.Rows.Count.ToString())
End Sub