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
- GACMembershipCondition.cs
- ResourceDescriptionAttribute.cs
- InheritanceService.cs
- PointAnimationUsingKeyFrames.cs
- ConnectorDragDropGlyph.cs
- AdRotatorDesigner.cs
- DataContractSerializerOperationFormatter.cs
- HandlerWithFactory.cs
- ToolStripSeparatorRenderEventArgs.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- MatrixKeyFrameCollection.cs
- EntitySetDataBindingList.cs
- PropertiesTab.cs
- FormatControl.cs
- ActivationServices.cs
- FloaterParaClient.cs
- UpdateRecord.cs
- DeclaredTypeValidatorAttribute.cs
- DoubleStorage.cs
- StandardBindingElement.cs
- ConstructorBuilder.cs
- WorkflowRuntimeServicesBehavior.cs
- DesignTable.cs
- NativeCompoundFileAPIs.cs
- HealthMonitoringSection.cs
- WebServiceEnumData.cs
- xmlsaver.cs
- Compensate.cs
- WindowsTokenRoleProvider.cs
- ConfigurationElement.cs
- MetadataArtifactLoaderFile.cs
- HandleRef.cs
- DateTimeUtil.cs
- HttpCapabilitiesBase.cs
- GridView.cs
- XhtmlBasicControlAdapter.cs
- DataSysAttribute.cs
- IntPtr.cs
- JsonFaultDetail.cs
- HorizontalAlignConverter.cs
- BitmapEffectInput.cs
- SafeFindHandle.cs
- HtmlTextArea.cs
- CodeAttributeDeclaration.cs
- CellConstant.cs
- TimerElapsedEvenArgs.cs
- TakeQueryOptionExpression.cs
- XmlHelper.cs
- pingexception.cs
- WizardStepBase.cs
- UrlMappingsSection.cs
- TargetConverter.cs
- HttpChannelBindingToken.cs
- SafeUserTokenHandle.cs
- SqlTypesSchemaImporter.cs
- DictionaryBase.cs
- TextControl.cs
- TaskFormBase.cs
- ConfigurationElementCollection.cs
- LateBoundBitmapDecoder.cs
- Bold.cs
- AssemblyResourceLoader.cs
- DbSourceCommand.cs
- BadImageFormatException.cs
- FormatConvertedBitmap.cs
- ImageSource.cs
- SqlLiftIndependentRowExpressions.cs
- FormViewPagerRow.cs
- DataControlButton.cs
- InstanceCreationEditor.cs
- ReflectionUtil.cs
- NGCSerializationManager.cs
- XmlName.cs
- TypeLoadException.cs
- _Win32.cs
- SequenceDesigner.xaml.cs
- Expander.cs
- sqlnorm.cs
- PeerMessageDispatcher.cs
- DesignerCategoryAttribute.cs
- AliasExpr.cs
- CommandHelpers.cs
- StateManagedCollection.cs
- WebControlAdapter.cs
- SvcMapFile.cs
- ServiceNameElementCollection.cs
- Comparer.cs
- HotCommands.cs
- XmlSerializationWriter.cs
- Certificate.cs
- TextEndOfLine.cs
- TemplateContent.cs
- HttpRuntimeSection.cs
- LingerOption.cs
- WhitespaceSignificantCollectionAttribute.cs
- EntityContainerEntitySet.cs
- CheckBoxRenderer.cs
- IconEditor.cs
- CallbackHandler.cs
- HtmlShim.cs