Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Data / System / Data / DataViewListener.cs / 5 / DataViewListener.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data {
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
internal sealed class DataViewListener {
private readonly WeakReference _dvWeak;
private DataTable _table;
private Index _index;
///
internal readonly int ObjectID;
internal DataViewListener(DataView dv) {
this.ObjectID = dv.ObjectID;
_dvWeak = new WeakReference(dv);
}
private void ChildRelationCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ChildRelationCollectionChanged(sender, e);
}
else {
CleanUp(true);
}
}
private void ParentRelationCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ParentRelationCollectionChanged(sender, e);
}
else {
CleanUp(true);
}
}
private void ColumnCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ColumnCollectionChangedInternal(sender, e);
}
else {
CleanUp(true);
}
}
///
/// Maintain the DataView before is raised.
///
internal void MaintainDataView(ListChangedType changedType, DataRow row, bool trackAddRemove) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.MaintainDataView(changedType, row, trackAddRemove);
}
else {
CleanUp(true);
}
}
internal void IndexListChanged(ListChangedEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.IndexListChangedInternal(e);
}
else {
CleanUp(true);
}
}
internal void RegisterMetaDataEvents(DataTable table) {
Debug.Assert(null == _table, "DataViewListener already registered table");
_table = table;
if (table != null) {
// actively remove listeners without a target
RegisterListener(table);
// start listening to events
CollectionChangeEventHandler handlerCollection = new CollectionChangeEventHandler(ColumnCollectionChanged);
table.Columns.ColumnPropertyChanged += handlerCollection;
table.Columns.CollectionChanged += handlerCollection;
CollectionChangeEventHandler handlerChildRelation = new CollectionChangeEventHandler(ChildRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ChildRelations)).RelationPropertyChanged += handlerChildRelation;
table.ChildRelations.CollectionChanged += handlerChildRelation;
CollectionChangeEventHandler handlerParentRelation = new CollectionChangeEventHandler(ParentRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ParentRelations)).RelationPropertyChanged += handlerParentRelation;
table.ParentRelations.CollectionChanged += handlerParentRelation;
}
}
internal void UnregisterMetaDataEvents() {
UnregisterMetaDataEvents(true);
}
private void UnregisterMetaDataEvents(bool updateListeners) {
DataTable table = _table;
_table = null;
if (table != null) {
CollectionChangeEventHandler handlerCollection = new CollectionChangeEventHandler(ColumnCollectionChanged);
table.Columns.ColumnPropertyChanged -= handlerCollection;
table.Columns.CollectionChanged -= handlerCollection;
CollectionChangeEventHandler handlerChildRelation = new CollectionChangeEventHandler(ChildRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ChildRelations)).RelationPropertyChanged -= handlerChildRelation;
table.ChildRelations.CollectionChanged -= handlerChildRelation;
CollectionChangeEventHandler handlerParentRelation = new CollectionChangeEventHandler(ParentRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ParentRelations)).RelationPropertyChanged -= handlerParentRelation;
table.ParentRelations.CollectionChanged -= handlerParentRelation;
if (updateListeners) {
List listeners = table.GetListeners();
lock (listeners) {
listeners.Remove(this);
}
}
}
}
internal void RegisterListChangedEvent(Index index) {
Debug.Assert(null == _index, "DataviewListener already registered index");
_index = index;
if (null != index) {
lock (index) {
index.AddRef();
index.ListChangedAdd(this);
}
}
}
internal void UnregisterListChangedEvent() {
Index index = _index;
_index = null;
if (index != null) {
lock (index) {
index.ListChangedRemove(this);
if (index.RemoveRef() <= 1) {
index.RemoveRef();
}
}
}
}
private void CleanUp(bool updateListeners) {
UnregisterMetaDataEvents(updateListeners);
UnregisterListChangedEvent();
}
private void RegisterListener(DataTable table) {
List listeners = table.GetListeners();
lock (listeners) {
for (int i = listeners.Count - 1; 0 <= i; --i) {
DataViewListener listener = listeners[i];
if (!listener._dvWeak.IsAlive) {
listeners.RemoveAt(i);
listener.CleanUp(false);
}
}
listeners.Add(this);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data {
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
internal sealed class DataViewListener {
private readonly WeakReference _dvWeak;
private DataTable _table;
private Index _index;
///
internal readonly int ObjectID;
internal DataViewListener(DataView dv) {
this.ObjectID = dv.ObjectID;
_dvWeak = new WeakReference(dv);
}
private void ChildRelationCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ChildRelationCollectionChanged(sender, e);
}
else {
CleanUp(true);
}
}
private void ParentRelationCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ParentRelationCollectionChanged(sender, e);
}
else {
CleanUp(true);
}
}
private void ColumnCollectionChanged(object sender, CollectionChangeEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.ColumnCollectionChangedInternal(sender, e);
}
else {
CleanUp(true);
}
}
///
/// Maintain the DataView before is raised.
///
internal void MaintainDataView(ListChangedType changedType, DataRow row, bool trackAddRemove) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.MaintainDataView(changedType, row, trackAddRemove);
}
else {
CleanUp(true);
}
}
internal void IndexListChanged(ListChangedEventArgs e) {
DataView dv = (DataView)_dvWeak.Target;
if (dv != null) {
dv.IndexListChangedInternal(e);
}
else {
CleanUp(true);
}
}
internal void RegisterMetaDataEvents(DataTable table) {
Debug.Assert(null == _table, "DataViewListener already registered table");
_table = table;
if (table != null) {
// actively remove listeners without a target
RegisterListener(table);
// start listening to events
CollectionChangeEventHandler handlerCollection = new CollectionChangeEventHandler(ColumnCollectionChanged);
table.Columns.ColumnPropertyChanged += handlerCollection;
table.Columns.CollectionChanged += handlerCollection;
CollectionChangeEventHandler handlerChildRelation = new CollectionChangeEventHandler(ChildRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ChildRelations)).RelationPropertyChanged += handlerChildRelation;
table.ChildRelations.CollectionChanged += handlerChildRelation;
CollectionChangeEventHandler handlerParentRelation = new CollectionChangeEventHandler(ParentRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ParentRelations)).RelationPropertyChanged += handlerParentRelation;
table.ParentRelations.CollectionChanged += handlerParentRelation;
}
}
internal void UnregisterMetaDataEvents() {
UnregisterMetaDataEvents(true);
}
private void UnregisterMetaDataEvents(bool updateListeners) {
DataTable table = _table;
_table = null;
if (table != null) {
CollectionChangeEventHandler handlerCollection = new CollectionChangeEventHandler(ColumnCollectionChanged);
table.Columns.ColumnPropertyChanged -= handlerCollection;
table.Columns.CollectionChanged -= handlerCollection;
CollectionChangeEventHandler handlerChildRelation = new CollectionChangeEventHandler(ChildRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ChildRelations)).RelationPropertyChanged -= handlerChildRelation;
table.ChildRelations.CollectionChanged -= handlerChildRelation;
CollectionChangeEventHandler handlerParentRelation = new CollectionChangeEventHandler(ParentRelationCollectionChanged);
((DataRelationCollection.DataTableRelationCollection)(table.ParentRelations)).RelationPropertyChanged -= handlerParentRelation;
table.ParentRelations.CollectionChanged -= handlerParentRelation;
if (updateListeners) {
List listeners = table.GetListeners();
lock (listeners) {
listeners.Remove(this);
}
}
}
}
internal void RegisterListChangedEvent(Index index) {
Debug.Assert(null == _index, "DataviewListener already registered index");
_index = index;
if (null != index) {
lock (index) {
index.AddRef();
index.ListChangedAdd(this);
}
}
}
internal void UnregisterListChangedEvent() {
Index index = _index;
_index = null;
if (index != null) {
lock (index) {
index.ListChangedRemove(this);
if (index.RemoveRef() <= 1) {
index.RemoveRef();
}
}
}
}
private void CleanUp(bool updateListeners) {
UnregisterMetaDataEvents(updateListeners);
UnregisterListChangedEvent();
}
private void RegisterListener(DataTable table) {
List listeners = table.GetListeners();
lock (listeners) {
for (int i = listeners.Count - 1; 0 <= i; --i) {
DataViewListener listener = listeners[i];
if (!listener._dvWeak.IsAlive) {
listeners.RemoveAt(i);
listener.CleanUp(false);
}
}
listeners.Add(this);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- InternalConfigSettingsFactory.cs
- GatewayIPAddressInformationCollection.cs
- SymbolMethod.cs
- XmlReturnWriter.cs
- TextEditorDragDrop.cs
- SqlConnectionFactory.cs
- RegisteredHiddenField.cs
- StorageAssociationSetMapping.cs
- sitestring.cs
- CodeCatchClauseCollection.cs
- AutomationElement.cs
- CodeArgumentReferenceExpression.cs
- ipaddressinformationcollection.cs
- OrthographicCamera.cs
- PersonalizationEntry.cs
- ExpanderAutomationPeer.cs
- TemplateBindingExpression.cs
- KeyGestureConverter.cs
- XmlComment.cs
- BuildManagerHost.cs
- CodeAttachEventStatement.cs
- WebPartConnectionsCancelVerb.cs
- RequestCachingSection.cs
- WindowsGraphicsWrapper.cs
- XmlQualifiedName.cs
- PointAnimation.cs
- XmlNamespaceMapping.cs
- EncryptedKey.cs
- ToolStripLabel.cs
- CipherData.cs
- mactripleDES.cs
- DispatcherExceptionFilterEventArgs.cs
- RegistrationServices.cs
- PartitionerStatic.cs
- WebPartDescriptionCollection.cs
- XmlnsPrefixAttribute.cs
- Tokenizer.cs
- DisplayClaim.cs
- ToolStripGrip.cs
- ExitEventArgs.cs
- EntityDataSourceQueryBuilder.cs
- DataControlLinkButton.cs
- QilSortKey.cs
- InvalidCardException.cs
- BaseContextMenu.cs
- OpenFileDialog.cs
- DispatcherExceptionFilterEventArgs.cs
- Scheduler.cs
- PersonalizationProviderCollection.cs
- FontUnit.cs
- SynchronizedDispatch.cs
- KeyGestureValueSerializer.cs
- PathHelper.cs
- SystemUdpStatistics.cs
- ToolStripDropDownMenu.cs
- ToolStripArrowRenderEventArgs.cs
- RMEnrollmentPage2.cs
- PipelineDeploymentState.cs
- SendingRequestEventArgs.cs
- WebPartCollection.cs
- SqlInternalConnection.cs
- Part.cs
- SimpleLine.cs
- PersonalizationState.cs
- MetricEntry.cs
- GridViewAutomationPeer.cs
- UInt16Converter.cs
- JpegBitmapDecoder.cs
- ChameleonKey.cs
- ArrayTypeMismatchException.cs
- COM2PropertyBuilderUITypeEditor.cs
- FixedSOMElement.cs
- OperandQuery.cs
- _ChunkParse.cs
- RegistryPermission.cs
- ThreadAttributes.cs
- util.cs
- LiteralDesigner.cs
- AmbientLight.cs
- ProjectionCamera.cs
- SwitchLevelAttribute.cs
- XpsFixedDocumentSequenceReaderWriter.cs
- WebReferencesBuildProvider.cs
- ChildrenQuery.cs
- DataFormats.cs
- HttpListenerException.cs
- EditorZoneBase.cs
- DigitShape.cs
- StringPropertyBuilder.cs
- WindowsFormsHost.cs
- BinaryFormatter.cs
- HttpResponseHeader.cs
- TextTreeTextNode.cs
- ControlEvent.cs
- ScriptResourceMapping.cs
- keycontainerpermission.cs
- DataGridViewColumnDesigner.cs
- TransformerInfoCollection.cs
- FileDialog.cs
- ChildChangedEventArgs.cs