Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Data / System / Data / DataViewListener.cs / 2 / 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. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SingleAnimationUsingKeyFrames.cs
- DbReferenceCollection.cs
- ActivityIdHeader.cs
- DTCTransactionManager.cs
- CodeAssignStatement.cs
- DesignerWebPartChrome.cs
- DuplicateWaitObjectException.cs
- XmlSchemaAnyAttribute.cs
- Grant.cs
- UInt16Storage.cs
- login.cs
- DataTemplateSelector.cs
- SimpleLine.cs
- EmptyTextWriter.cs
- BinHexEncoding.cs
- DataControlFieldCell.cs
- ByteStreamGeometryContext.cs
- XmlLangPropertyAttribute.cs
- FixedTextContainer.cs
- DialogResultConverter.cs
- objectquery_tresulttype.cs
- ExtensionQuery.cs
- BufferedReadStream.cs
- ScriptResourceMapping.cs
- TextEditorSelection.cs
- PageRanges.cs
- HtmlControlPersistable.cs
- BaseCodePageEncoding.cs
- InspectionWorker.cs
- ResourceManagerWrapper.cs
- AccessText.cs
- CodeComment.cs
- PageAsyncTaskManager.cs
- BaseConfigurationRecord.cs
- EntityUtil.cs
- InkSerializer.cs
- WmlSelectionListAdapter.cs
- StylusCaptureWithinProperty.cs
- Soap12ProtocolReflector.cs
- XmlAttributeAttribute.cs
- ColorContextHelper.cs
- SiteOfOriginContainer.cs
- DateTimeConverter2.cs
- UrlAuthorizationModule.cs
- MissingSatelliteAssemblyException.cs
- FormViewUpdateEventArgs.cs
- StrokeNodeEnumerator.cs
- XmlNodeList.cs
- SqlCharStream.cs
- ApplicationDirectoryMembershipCondition.cs
- ForwardPositionQuery.cs
- ListManagerBindingsCollection.cs
- CompilationUtil.cs
- Rotation3D.cs
- SmtpCommands.cs
- DataGridViewCellMouseEventArgs.cs
- BrowserDefinition.cs
- ImageConverter.cs
- Misc.cs
- LaxModeSecurityHeaderElementInferenceEngine.cs
- SmuggledIUnknown.cs
- TrustLevelCollection.cs
- Track.cs
- RepeaterItemCollection.cs
- CanonicalFontFamilyReference.cs
- ValueConversionAttribute.cs
- SymmetricKey.cs
- Maps.cs
- StreamResourceInfo.cs
- CodeFieldReferenceExpression.cs
- RenameRuleObjectDialog.Designer.cs
- XsltContext.cs
- FontSource.cs
- WebPageTraceListener.cs
- OuterGlowBitmapEffect.cs
- SrgsElementList.cs
- WorkflowApplicationAbortedException.cs
- WindowsListViewGroupHelper.cs
- DBParameter.cs
- DataMemberAttribute.cs
- MetadataSet.cs
- PeerDuplexChannelListener.cs
- Validator.cs
- LocatorPart.cs
- GroupBoxAutomationPeer.cs
- ProfileServiceManager.cs
- XLinq.cs
- RotateTransform3D.cs
- AsyncDataRequest.cs
- BypassElementCollection.cs
- MouseCaptureWithinProperty.cs
- OleDbCommandBuilder.cs
- ControlAdapter.cs
- Converter.cs
- EncoderParameter.cs
- RegionInfo.cs
- StringPropertyBuilder.cs
- TextProperties.cs
- ResXResourceSet.cs
- XmlNavigatorStack.cs