Bagikan melalui


Menangani Peristiwa DataTable

Objek DataTable menyediakan serangkaian peristiwa yang dapat diproses oleh aplikasi. Tabel berikut ini menjelaskan peristiwa DataTable.

Peristiwa Deskripsi
Initialized Terjadi setelah metode EndInit dari DataTable dipanggil. Acara ini ditujukan terutama untuk mendukung skenario pada saat perancangan.
ColumnChanged Terjadi setelah nilai berhasil diubah dalam DataColumn.
ColumnChanging Terjadi ketika nilai telah dikirimkan untuk DataColumn.
RowChanged Terjadi setelah nilai DataColumn atau RowState dari sebuah DataRow dalam DataTable berhasil diubah.
RowChanging Terjadi ketika perubahan telah dikirimkan untuk nilai DataColumn atau RowStateDataRow di DataTable.
RowDeleted Terjadi setelah DataRow di DataTable telah ditandai sebagai Deleted.
RowDeleting Terjadi sebelum DataRow dalam DataTable ditandai sebagai Deleted.
TableCleared Terjadi setelah panggilan ke metode ClearDataTable telah berhasil menghapus setiap DataRow.
TableClearing Terjadi setelah metode Clear dipanggil tetapi sebelum operasi Clear dimulai.
TableNewRow Terjadi setelah sebuah DataRow baru dibuat oleh panggilan ke metode NewRow dari DataTable.
Disposed Terjadi ketika DataTable adalah Disposed. Diwarisi dari MarshalByValueComponent.

Nota

Sebagian besar operasi yang menambahkan atau menghapus baris tidak menaikkan peristiwa ColumnChanged dan ColumnChanging. Namun, metode ReadXml memang memicu kejadian ColumnChanged dan ColumnChanging, kecuali XmlReadMode diatur ke DiffGram atau diatur ke Auto saat dokumen XML yang dibaca adalah DiffGram.

Peringatan

Kerusakan data dapat terjadi jika data dimodifikasi pada DataSet tempat peristiwa RowChanged dipicu. Tidak ada pengecualian yang akan dimunculkan jika kerusakan data tersebut terjadi.

Properti Constraints menyimpan instans ConstraintCollection. Kelas ConstraintCollection mengekspos peristiwa CollectionChanged. Peristiwa ini dipicu ketika batasan ditambahkan, dimodifikasi, atau dihapus dari ConstraintCollection.

Properti Columns menyimpan instans DataColumnCollection. Kelas DataColumnCollection mengekspos peristiwa CollectionChanged. Peristiwa ini terpicu ketika DataColumn ditambahkan, dimodifikasi, atau dihapus dari DataColumnCollection. Modifikasi yang menyebabkan event diaktifkan mencakup perubahan pada nama, jenis, ekspresi, atau posisi urutan kolom.

Properti Tables pada DataSet memiliki instans DataTableCollection. Kelas DataTableCollection mengekspos baik peristiwa CollectionChanged maupun peristiwa CollectionChanging. Peristiwa ini terjadi ketika DataTable ditambahkan ke atau dihapus dari DataSet.

Perubahan pada DataRows juga dapat memicu kejadian untuk DataViewyang terkait. Kelas DataView mengekspos peristiwa ListChanged yang diaktifkan saat nilai DataColumn berubah atau saat komposisi atau urutan pengurutan tampilan berubah. Kelas DataRowView menyediakan peristiwa PropertyChanged yang diaktifkan saat nilai DataColumn terkait berubah.

Urutan Operasi

Berikut adalah urutan operasi yang terjadi ketika DataRow ditambahkan, dimodifikasi, atau dihapus:

  1. Buat catatan yang diusulkan dan terapkan perubahan apa pun.

  2. Periksa batasan untuk kolom yang bukan ekspresi.

  3. Naikkan peristiwa RowChanging atau RowDeleting sebagaimana berlaku.

  4. Atur catatan yang diusulkan menjadi catatan saat ini.

  5. Perbarui indeks terkait.

  6. Ajukan peristiwa ListChanged untuk objek DataView terkait dan peristiwa PropertyChanged untuk objek DataRowView terkait.

  7. Evaluasi semua kolom ekspresi, tetapi tunda memeriksa batasan apa pun pada kolom ini.

  8. Naikkan peristiwa ListChanged untuk objek DataView terkait dan peristiwa PropertyChanged untuk objek DataRowView terkait yang terpengaruh oleh evaluasi kolom ekspresi.

  9. Munculkan peristiwa RowChanged atau RowDeleted sebagaimana berlaku.

  10. Periksa batasan pada kolom ekspresi.

Nota

Perubahan pada kolom ekspresi tidak pernah memicu peristiwa DataTable. Perubahan pada kolom ekspresi hanya menaikkan peristiwa DataView dan DataRowView. Kolom ekspresi bisa bergantung pada beberapa kolom lain, dan dapat dievaluasi beberapa kali selama satu operasi DataRow. Setiap evaluasi ekspresi menghasilkan peristiwa, dan satu operasi DataRow dapat menghasilkan beberapa peristiwa ListChanged dan PropertyChanged ketika kolom ekspresi terpengaruh, mungkin termasuk beberapa peristiwa untuk kolom ekspresi yang sama.

Peringatan

Jangan melemparkan NullReferenceException dalam penanganan aktivitas RowChanged. Jika NullReferenceException dilemparkan dalam event RowChanged dari DataTable, maka DataTable akan mengalami kerusakan.

Contoh

Contoh berikut menunjukkan cara membuat penanganan aktivitas untuk peristiwa RowChanged, RowChanging, RowDeleted, RowDeleting, ColumnChanged, ColumnChanging, TableNewRow, TableCleared, dan TableClearing. Setiap penanganan aktivitas menampilkan output di jendela konsol saat diaktifkan.

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

Lihat juga