Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Data / System / Data / DataViewListener.cs / 1305376 / 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 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) { Listis raised. /// 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
- TimelineClockCollection.cs
- FormViewAutoFormat.cs
- PeerApplication.cs
- ParameterSubsegment.cs
- ReadOnlyDataSource.cs
- Opcode.cs
- SHA1.cs
- BaseCodePageEncoding.cs
- InternalConfigConfigurationFactory.cs
- MediaElementAutomationPeer.cs
- DataRow.cs
- TextTrailingWordEllipsis.cs
- ProtectedConfiguration.cs
- Common.cs
- DependencyPropertyValueSerializer.cs
- CodeCatchClause.cs
- VisualCollection.cs
- WindowProviderWrapper.cs
- MenuItem.cs
- Win32SafeHandles.cs
- MarginCollapsingState.cs
- WebCategoryAttribute.cs
- Rect3DConverter.cs
- ShapingEngine.cs
- RoleService.cs
- InvalidFilterCriteriaException.cs
- AuthorizationRule.cs
- QueryOperationResponseOfT.cs
- TypeDescriptor.cs
- LightweightCodeGenerator.cs
- InplaceBitmapMetadataWriter.cs
- HttpServerChannel.cs
- DiscoveryExceptionDictionary.cs
- TreeNodeEventArgs.cs
- CodeAccessPermission.cs
- ZoneIdentityPermission.cs
- _ScatterGatherBuffers.cs
- StringWriter.cs
- TransformPattern.cs
- ControllableStoryboardAction.cs
- ProjectionPlanCompiler.cs
- ContentWrapperAttribute.cs
- MD5HashHelper.cs
- SelectingProviderEventArgs.cs
- PasswordBox.cs
- CreateUserErrorEventArgs.cs
- BindableAttribute.cs
- ProcessInfo.cs
- DataExpression.cs
- WebBrowserNavigatedEventHandler.cs
- Stack.cs
- URLIdentityPermission.cs
- DetailsViewModeEventArgs.cs
- BridgeDataReader.cs
- sqlpipe.cs
- RuleProcessor.cs
- EnumBuilder.cs
- PaginationProgressEventArgs.cs
- HttpModuleAction.cs
- RootCodeDomSerializer.cs
- TextDecoration.cs
- WinEventWrap.cs
- HtmlHead.cs
- DescriptionAttribute.cs
- SeparatorAutomationPeer.cs
- CompareValidator.cs
- SurrogateSelector.cs
- HelpInfo.cs
- LongTypeConverter.cs
- BrowserCapabilitiesFactory35.cs
- ToolStripItem.cs
- _NetworkingPerfCounters.cs
- Policy.cs
- DateTimeConverter2.cs
- ResolveNameEventArgs.cs
- WriteableBitmap.cs
- SafeTimerHandle.cs
- AdditionalEntityFunctions.cs
- BaseEntityWrapper.cs
- ComplexBindingPropertiesAttribute.cs
- WmlPhoneCallAdapter.cs
- AtomParser.cs
- PointUtil.cs
- CultureMapper.cs
- DataGridViewSortCompareEventArgs.cs
- MaterialCollection.cs
- ListDictionary.cs
- AnnotationResourceCollection.cs
- TabControl.cs
- X509Certificate2Collection.cs
- RoleBoolean.cs
- XComponentModel.cs
- SqlConnectionPoolProviderInfo.cs
- TreeBuilder.cs
- MsmqVerifier.cs
- PreviewKeyDownEventArgs.cs
- SingleAnimationBase.cs
- XmlCustomFormatter.cs
- EasingKeyFrames.cs
- AttachedPropertyDescriptor.cs