개체는 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