Aracılığıyla paylaş


DataTable Olaylarını İşleme

DataTable nesnesi, bir uygulama tarafından işlenebilen bir dizi olay sağlar. Aşağıdaki tabloda DataTable olayları açıklanmaktadır.

Etkinlik Açıklama
Initialized Bir EndInit'de DataTable yöntemi çağrıldıktan sonra oluşur. Bu olay öncelikli olarak tasarım zamanı senaryolarını desteklemeye yöneliktir.
ColumnChanged Başarıyla bir değer değiştirildiğinde DataColumn'da meydana gelir.
ColumnChanging DataColumniçin bir değer gönderildiğinde gerçekleşir.
RowChanged DataColumn değerinden sonra veya RowState içindeki bir DataRow'nin DataTable'i başarıyla değiştirildikten sonra gerçekleşir.
RowChanging DataColumn'te bir RowState'nin DataRow'i veya bir DataTable değeri için bir değişiklik gönderildiğinde gerçekleşir.
RowDeleted DataRow, DataTable içinde Deletedolarak işaretlendikten sonra gerçekleşir.
RowDeleting DataRow'in DataTable'de Deletedolarak işaretlenmesinden önce meydana gelir.
TableCleared Clear'in DataTable yöntemine yapılan çağrı, her bir DataRowbaşarıyla temizlendikten sonra gerçekleşir.
TableClearing Clear yöntemi çağrıldıktan sonra ancak Clear işlemi başlamadan önce gerçekleşir.
TableNewRow DataRow'nin NewRow yöntemine yapılan bir çağrı ile yeni bir DataTable oluşturulduktan sonra meydana gelir.
Disposed DataTable Disposedolduğunda gerçekleşir. MarshalByValueComponent öğesinden devralındı.

Uyarı

Satır ekleyen veya silen işlemlerin çoğu, ColumnChanged ve ColumnChanging olaylarını tetiklemiyor. Ancak, ReadXmlColumnChanged olarak ayarlanmadığı veya okunan XML belgesi ColumnChangingolduğunda XmlReadMode olarak ayarlanmadığı sürece DiffGram yöntemi Auto ve DiffGram olayları tetikler.

Uyarı

DataSet olayının oluşturulduğu bir RowChanged içinde veriler değiştirildiğinde veri bozulması meydana gelebilir. Bu tür veri bozulması oluşursa hiçbir özel durum tetiklenmez.

Constraints özelliği bir ConstraintCollection örneği barındırıyor. ConstraintCollection sınıfı bir CollectionChanged olayı tanımlar. Bu olay, bir kısıtlama ConstraintCollection'e eklendiğinde, değiştirildiğinde ya da kaldırıldığında tetiklenir.

Columns özelliği bir DataColumnCollection örneği barındırıyor. DataColumnCollection sınıfı bir CollectionChanged olayı tanımlar. Bu olay, DataColumn'e bir DataColumnCollection eklendiğinde, değiştirildiğinde veya kaldırıldığında tetiklenir. Olayın tetiklenmesine neden olan değişiklikler, bir sütunun adında, türünde, ifadesinde veya sıralama pozisyonunda yapılan değişiklikleri içerir.

Tables'in DataSet özelliği bir DataTableCollection örneğini barındırıyor. DataTableCollection sınıfı hem CollectionChanged hem de CollectionChanging olayını kullanıma sunar. Bu olaylar, bir DataTableDataSet'e eklendiğinde veya DataSet'den kaldırıldığında tetiklenir.

DataRows değişiklikleri, ilişkili bir DataViewiçin olayları da tetikleyebilir. DataView sınıfı, bir ListChanged değeri değiştiğinde veya görünümün oluşturma veya sıralama düzeni değiştiğinde tetikleyen bir DataColumn olayı kullanıma sunar. DataRowView sınıfı, ilişkili bir PropertyChanged değeri değiştiğinde tetiklenen bir DataColumn olayı kullanıma sunar.

İşlem Sırası

bir DataRow eklendiğinde, değiştirildiğinde veya silindiğinde gerçekleşen işlemlerin sırası aşağıdadır:

  1. Önerilen kaydı oluşturun ve değişiklikleri uygulayın.

  2. İfade olmayan sütunlar için kısıtlamaları denetleyin.

  3. RowChanging veya RowDeleting olaylarını uygun şekilde yükseltin.

  4. Önerilen kaydı geçerli kayıt olarak ayarlayın.

  5. İlişkili dizinleri güncelleştirin.

  6. İlişkili ListChanged nesneler için DataView olayları ve ilişkili PropertyChanged nesneler için DataRowView olayları tetikler.

  7. Tüm ifade sütunlarını değerlendirin, ancak bu sütunlardaki kısıtlamaları denetlemeyi geciktirin.

  8. İfade sütunu değerlendirmelerinden etkilenen ilişkili ListChanged nesneler için DataView olayları ve ilişkili PropertyChanged nesneler için DataRowView olayları tetikler.

  9. RowChanged veya RowDeleted olayları uygun şekilde yükseltin.

  10. İfade sütunlarında kısıtlamaları denetleyin.

Uyarı

İfade sütunlarına yapılan değişiklikler hiçbir zaman DataTable olayını tetiklemez. İfade sütunlarındaki değişiklikler yalnızca DataView ve DataRowView olaylarını tetikler. İfade sütunlarının diğer birden çok sütuna bağımlılığı olabilir ve tek bir DataRow işlemi sırasında birden çok kez değerlendirilebilir. Her ifade değerlendirmesi olayları tetikler ve tek bir DataRow işlemi, ifade sütunları etkilendiğinde birden çok ListChanged ve PropertyChanged olay oluşturabilir ve muhtemelen aynı ifade sütunu için birden çok olay da dahil olabilir.

Uyarı

NullReferenceException olay işleyicisi içinde bir RowChanged fırlatmayın. Bir NullReferenceException'deki RowChanged olayı sırasında bir DataTable atılırsa, DataTable bozulur.

Örnek

Aşağıdaki örnek, RowChanged, RowChanging, RowDeleted, RowDeleting, ColumnChanged, ColumnChanging, TableNewRow, TableClearedve TableClearing olayları için olay işleyicilerinin nasıl oluşturulacağını gösterir. Her bir olay işleyicisi, çalıştırıldığında konsol penceresinde çıkışı görüntüler.

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

Ayrıca bkz.