Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Data / System / Data / DataViewListener.cs / 1 / 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
- ListViewInsertedEventArgs.cs
- ContextMenuStripGroup.cs
- ModelItem.cs
- RecordManager.cs
- WebPartHelpVerb.cs
- RepeaterItem.cs
- HwndStylusInputProvider.cs
- control.ime.cs
- ColumnHeader.cs
- DrawingImage.cs
- XmlAtomicValue.cs
- PriorityQueue.cs
- ConvertEvent.cs
- TimelineGroup.cs
- DataControlCommands.cs
- PersonalizationDictionary.cs
- XmlSubtreeReader.cs
- SmtpReplyReader.cs
- Container.cs
- ClientCredentialsSecurityTokenManager.cs
- StringPropertyBuilder.cs
- SqlBooleanMismatchVisitor.cs
- DispatcherObject.cs
- SqlDelegatedTransaction.cs
- NaturalLanguageHyphenator.cs
- WorkflowPageSetupDialog.cs
- SqlGenericUtil.cs
- PreservationFileReader.cs
- ImageIndexConverter.cs
- ReadOnlyKeyedCollection.cs
- FontWeight.cs
- XmlNamespaceManager.cs
- DisplayNameAttribute.cs
- StringSource.cs
- WMIGenerator.cs
- FlowNode.cs
- XmlCountingReader.cs
- GradientBrush.cs
- PointF.cs
- PathGeometry.cs
- FragmentQueryProcessor.cs
- NamespaceExpr.cs
- Internal.cs
- WindowsAuthenticationModule.cs
- DocumentViewerBaseAutomationPeer.cs
- HotSpotCollection.cs
- LightweightCodeGenerator.cs
- ManifestSignatureInformation.cs
- EntityDataSourceDesigner.cs
- InputMethodStateChangeEventArgs.cs
- EntityModelSchemaGenerator.cs
- DataGridColumnCollectionEditor.cs
- SqlDuplicator.cs
- _HTTPDateParse.cs
- DataGridSortCommandEventArgs.cs
- IndexOutOfRangeException.cs
- Timer.cs
- CodePrimitiveExpression.cs
- InstanceOwner.cs
- FreezableDefaultValueFactory.cs
- TemplateContent.cs
- IsolatedStorage.cs
- ControlCollection.cs
- PropertyChangedEventArgs.cs
- PrintDialog.cs
- InkCanvas.cs
- Label.cs
- PersonalizationState.cs
- ConfigurationStrings.cs
- StringValueSerializer.cs
- BitmapDecoder.cs
- HtmlString.cs
- ControlSerializer.cs
- TrackingWorkflowEventArgs.cs
- mansign.cs
- ELinqQueryState.cs
- EntityEntry.cs
- RtType.cs
- Mouse.cs
- NativeMethods.cs
- DataGridViewRowHeaderCell.cs
- ETagAttribute.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- PropertyValueChangedEvent.cs
- DSASignatureFormatter.cs
- ActivityDesigner.cs
- ThreadStartException.cs
- LiteralText.cs
- Grant.cs
- SessionEndingCancelEventArgs.cs
- ColumnResult.cs
- Utilities.cs
- SwitchLevelAttribute.cs
- SafeMILHandleMemoryPressure.cs
- TreeView.cs
- BaseCAMarshaler.cs
- xmlfixedPageInfo.cs
- ProbeMatches11.cs
- ExtenderControl.cs
- Hex.cs