Code:
/ FX-1434 / FX-1434 / 1.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
- ProcessHost.cs
- OleDbRowUpdatedEvent.cs
- UdpConstants.cs
- SystemWebSectionGroup.cs
- SocketPermission.cs
- DataRelationCollection.cs
- Translator.cs
- AmbientEnvironment.cs
- UserControl.cs
- ControlCodeDomSerializer.cs
- VerticalAlignConverter.cs
- TypeReference.cs
- RemoteWebConfigurationHostStream.cs
- SimpleType.cs
- ModuleConfigurationInfo.cs
- TextAction.cs
- IfElseDesigner.xaml.cs
- ReadContentAsBinaryHelper.cs
- DataBindingCollectionConverter.cs
- SerTrace.cs
- SqlStatistics.cs
- MemoryStream.cs
- PeerApplicationLaunchInfo.cs
- QueryCreatedEventArgs.cs
- ClientTargetCollection.cs
- BidirectionalDictionary.cs
- GridViewCommandEventArgs.cs
- CultureInfo.cs
- CharConverter.cs
- UdpMessageProperty.cs
- AlignmentXValidation.cs
- OdbcCommandBuilder.cs
- AsyncInvokeContext.cs
- DependencyObject.cs
- TypedDatasetGenerator.cs
- XamlSerializerUtil.cs
- SafeNativeMethods.cs
- ObjectNavigationPropertyMapping.cs
- XmlTextEncoder.cs
- ACE.cs
- XmlSerializationGeneratedCode.cs
- FixedSOMTable.cs
- Assembly.cs
- OperationContextScope.cs
- RijndaelManaged.cs
- ReflectionServiceProvider.cs
- SubMenuStyleCollection.cs
- MethodImplAttribute.cs
- DocumentGrid.cs
- messageonlyhwndwrapper.cs
- ElementHostAutomationPeer.cs
- TagMapInfo.cs
- SqlUDTStorage.cs
- WpfWebRequestHelper.cs
- JumpPath.cs
- SqlDeflator.cs
- CollectionExtensions.cs
- ImageAnimator.cs
- DynamicResourceExtension.cs
- HtmlTableRowCollection.cs
- CodeAttributeDeclarationCollection.cs
- ProviderCommandInfoUtils.cs
- SyndicationDeserializer.cs
- DataKeyArray.cs
- HtmlObjectListAdapter.cs
- WebPartZoneAutoFormat.cs
- FileDialogCustomPlacesCollection.cs
- PropertyGridEditorPart.cs
- HttpClientCertificate.cs
- DoubleLink.cs
- HttpStreamXmlDictionaryWriter.cs
- AutoCompleteStringCollection.cs
- RangeValidator.cs
- WSFederationHttpSecurityElement.cs
- RuleCache.cs
- SqlConnectionFactory.cs
- HelpInfo.cs
- FrameworkTextComposition.cs
- ObjectPersistData.cs
- ListViewVirtualItemsSelectionRangeChangedEvent.cs
- PolicyManager.cs
- ExpressionConverter.cs
- SpeechUI.cs
- HtmlSelect.cs
- EnglishPluralizationService.cs
- PrincipalPermission.cs
- OperatorExpressions.cs
- CacheSection.cs
- InternalBufferOverflowException.cs
- ReferenceConverter.cs
- GACMembershipCondition.cs
- Oci.cs
- RegexMatchCollection.cs
- EventProvider.cs
- ScriptManager.cs
- dtdvalidator.cs
- EntityRecordInfo.cs
- CAGDesigner.cs
- ItemsPanelTemplate.cs
- SolidColorBrush.cs