| File: System\Data\DataTableReaderListener.cs | Web Access |
| Project: src\runtime\src\libraries\System.Data.Common\src\System.Data.Common.csproj (System.Data.Common) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; namespace System.Data { internal sealed class DataTableReaderListener { private DataTable? _currentDataTable; private bool _isSubscribed; private readonly WeakReference _readerWeak; internal DataTableReaderListener(DataTableReader reader) { if (reader == null) { throw ExceptionBuilder.ArgumentNull(nameof(DataTableReader)); } if (_currentDataTable != null) { UnSubscribeEvents(); } _readerWeak = new WeakReference(reader); _currentDataTable = reader.CurrentDataTable; if (_currentDataTable != null) { SubscribeEvents(); } } internal void CleanUp() => UnSubscribeEvents(); internal void UpdataTable(DataTable datatable) { if (datatable == null) { throw ExceptionBuilder.ArgumentNull(nameof(DataTable)); } UnSubscribeEvents(); _currentDataTable = datatable; SubscribeEvents(); } private void SubscribeEvents() { if (_currentDataTable == null) { return; } if (_isSubscribed) { return; } _currentDataTable.Columns.ColumnPropertyChanged += new CollectionChangeEventHandler(SchemaChanged); _currentDataTable.Columns.CollectionChanged += new CollectionChangeEventHandler(SchemaChanged); _currentDataTable.RowChanged += new DataRowChangeEventHandler(DataChanged); _currentDataTable.RowDeleted += new DataRowChangeEventHandler(DataChanged); _currentDataTable.TableCleared += new DataTableClearEventHandler(DataTableCleared); _isSubscribed = true; } private void UnSubscribeEvents() { if (_currentDataTable == null) { return; } if (!_isSubscribed) { return; } _currentDataTable.Columns.ColumnPropertyChanged -= new CollectionChangeEventHandler(SchemaChanged); _currentDataTable.Columns.CollectionChanged -= new CollectionChangeEventHandler(SchemaChanged); _currentDataTable.RowChanged -= new DataRowChangeEventHandler(DataChanged); _currentDataTable.RowDeleted -= new DataRowChangeEventHandler(DataChanged); _currentDataTable.TableCleared -= new DataTableClearEventHandler(DataTableCleared); _isSubscribed = false; } private void DataTableCleared(object sender, DataTableClearEventArgs e) { DataTableReader? reader = (DataTableReader?)_readerWeak.Target; if (reader != null) { reader.DataTableCleared(); } else { UnSubscribeEvents(); } } private void SchemaChanged(object? sender, CollectionChangeEventArgs e) { DataTableReader? reader = (DataTableReader?)_readerWeak.Target; if (reader != null) { reader.SchemaChanged(); } else { UnSubscribeEvents(); } } private void DataChanged(object? sender, DataRowChangeEventArgs args) { DataTableReader? reader = (DataTableReader?)_readerWeak.Target; if (reader != null) { reader.DataChanged(args); } else { UnSubscribeEvents(); } } } }