Obsługa zdarzeń elementu DataTable
Obiekt DataTable zawiera serię zdarzeń, które mogą być przetwarzane przez aplikację. W poniższej tabeli opisano DataTable
zdarzenia.
Wydarzenie | opis |
---|---|
Initialized | Występuje po wywołaniu EndInit metody DataTable . To zdarzenie jest przeznaczone głównie do obsługi scenariuszy czasu projektowania. |
ColumnChanged | Występuje po pomyślnym zmianie wartości w obiekcie DataColumn. |
ColumnChanging | Występuje, gdy wartość została przesłana dla elementu DataColumn . |
RowChanged | Występuje po pomyślnym DataColumn zmianie wartości lub RowState wartości DataRow w obiekcie DataTable . |
RowChanging | Występuje, gdy zmiana została przesłana dla DataColumn wartości lub RowState elementu DataRow w obiekcie DataTable . |
RowDeleted | Występuje po tym, jak element DataRow w obiekcie DataTable został oznaczony jako Deleted . |
RowDeleting | Występuje przed oznaczeniem w DataRow obiekcie DataTable jako Deleted . |
TableCleared | Występuje po wywołaniu Clear metody DataTable metody pomyślnie wyczyszczonej co DataRow . |
TableClearing | Występuje po wywołaniu Clear metody , ale przed rozpoczęciem Clear operacji. |
TableNewRow | Występuje po utworzeniu nowego DataRow przez wywołanie NewRow metody .DataTable |
Disposed | Występuje, gdy element ma wartość DataTable Disposed . Dziedziczone z MarshalByValueComponentelementu . |
Uwaga
Większość operacji, które dodają lub usuwają wiersze, nie zgłaszają zdarzeń ColumnChanged
i ColumnChanging
. ReadXml
Jednak metoda zgłasza zdarzenia ColumnChanged
i ColumnChanging
, chyba że XmlReadMode
parametr jest ustawiony na DiffGram
lub jest ustawionyAuto
, gdy odczytywany dokument XML jest DiffGram
.
Ostrzeżenie
Uszkodzenie danych może wystąpić, jeśli dane są modyfikowane w obiekcie DataSet
, z którego RowChanged
jest zgłaszane zdarzenie. W przypadku wystąpienia takiego uszkodzenia danych nie zostanie zgłoszony żaden wyjątek.
Dodatkowe powiązane zdarzenia
Właściwość Constraints zawiera ConstraintCollection wystąpienie. Klasa ConstraintCollection uwidacznia CollectionChanged zdarzenie. To zdarzenie jest uruchamiane po dodaniu, zmodyfikowaniu lub usunięciu ograniczenia z klasy ConstraintCollection
.
Właściwość Columns zawiera DataColumnCollection wystąpienie. Klasa DataColumnCollection
uwidacznia CollectionChanged zdarzenie. To zdarzenie jest uruchamiane po DataColumn
dodaniu, zmodyfikowaniu lub usunięciu elementu z obiektu DataColumnCollection
. Modyfikacje, które powodują wyzwolenie zdarzenia, obejmują zmiany nazwy, typu, wyrażenia lub porządkowej pozycji kolumny.
Właściwość Tables obiektu DataSet przechowuje DataTableCollection wystąpienie. Klasa DataTableCollection
uwidacznia zarówno zdarzenie, jak CollectionChanged
CollectionChanging
i . Te zdarzenia są wyzwalane po dodaniu lub usunięciu elementu DataTable
z klasy DataSet
.
Zmiany, które DataRows
mogą również wyzwalać zdarzenia dla skojarzonego DataViewelementu . Klasa DataView
uwidacznia ListChanged zdarzenie, które jest uruchamiane, gdy DataColumn
wartość zmienia się lub gdy zmienia się kompozycja lub kolejność sortowania widoku. Klasa DataRowView uwidacznia PropertyChanged zdarzenie, które jest uruchamiane po zmianie skojarzonej DataColumn
wartości.
sekwencja operacji
Oto sekwencja operacji, które występują po DataRow
dodaniu, zmodyfikowaniu lub usunięciu elementu:
Utwórz proponowany rekord i zastosuj wszelkie zmiany.
Sprawdź ograniczenia dla kolumn innych niż wyrażenia.
RowChanging
W razie potrzeby zgłoś zdarzenia lubRowDeleting
.Ustaw proponowany rekord jako bieżący rekord.
Zaktualizuj wszystkie skojarzone indeksy.
Zgłaszaj
ListChanged
zdarzenia dla skojarzonychDataView
obiektów iPropertyChanged
zdarzeń skojarzonychDataRowView
obiektów.Oceń wszystkie kolumny wyrażeń, ale opóźnij sprawdzanie ograniczeń dotyczących tych kolumn.
Zgłaszaj
ListChanged
zdarzenia dla skojarzonych obiektów iPropertyChanged
zdarzeń dla skojarzonychDataView
DataRowView
obiektów, których dotyczy ocena kolumn wyrażeń.W razie potrzeby zgłaszaj
RowChanged
zdarzenia lubRowDeleted
zgłaszaj je.Sprawdź ograniczenia dotyczące kolumn wyrażeń.
Uwaga
Zmiany w kolumnach wyrażeń nigdy nie zgłaszają DataTable
zdarzeń. Zmiany w kolumnach wyrażeń są wywoływane DataView
tylko i DataRowView
zdarzenia. Kolumny wyrażeń mogą mieć zależności od wielu innych kolumn i można je wielokrotnie oceniać podczas jednej DataRow
operacji. Każda ocena wyrażenia zgłasza zdarzenia, a pojedyncza DataRow
operacja może zgłaszać wiele ListChanged
zdarzeń, PropertyChanged
gdy mają to wpływ na kolumny wyrażeń, w tym wiele zdarzeń dla tej samej kolumny wyrażeń.
Ostrzeżenie
Nie zgłaszaj NullReferenceException elementu w programie obsługi zdarzeń RowChanged
. Jeśli element NullReferenceException jest zgłaszany w RowChanged
ramach zdarzenia DataTable
, DataTable
element zostanie uszkodzony.
Przykład
W poniższym przykładzie pokazano, jak utworzyć programy obsługi zdarzeń dla RowChanged
zdarzeń , , TableNewRow
ColumnChanged
RowChanging
RowDeleting
ColumnChanging
RowDeleted
TableCleared
i .TableClearing
Każdy program obsługi zdarzeń wyświetla dane wyjściowe w oknie konsoli po jego uruchomieniu.
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 = new DataColumn[] { 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={0}; action={1}",
e.Row["name"], e.Action);
static void Row_Changing(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine("Row_Changing Event: name={0}; action={1}",
e.Row["name"], e.Action);
static void Row_Deleted(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine("Row_Deleted Event: name={0}; action={1}",
e.Row["name", DataRowVersion.Original], e.Action);
static void Row_Deleting(object sender,
DataRowChangeEventArgs e) =>
Console.WriteLine("Row_Deleting Event: name={0}; action={1}",
e.Row["name"], e.Action);
static void Column_Changed(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine("Column_Changed Event: ColumnName={0}; RowState={1}",
e.Column.ColumnName, e.Row.RowState);
static void Column_Changing(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine("Column_Changing Event: ColumnName={0}; RowState={1}",
e.Column.ColumnName, e.Row.RowState);
static void Table_NewRow(object sender,
DataTableNewRowEventArgs e) =>
Console.WriteLine("Table_NewRow Event: RowState={0}",
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