1 //------------------------------------------------------------------------------ 2 // <copyright file="DataViewManager.cs" company="Microsoft"> 3 // Copyright (c) Microsoft Corporation. All rights reserved. 4 // </copyright> 5 // <owner current="true" primary="true">Microsoft</owner> 6 // <owner current="true" primary="false">Microsoft</owner> 7 // <owner current="false" primary="false">Microsoft</owner> 8 //------------------------------------------------------------------------------ 9 10 namespace System.Data { 11 using System; 12 using System.ComponentModel; 13 using System.Collections; 14 using System.IO; 15 using System.Text; 16 using System.Xml; 17 18 [ 19 Designer("Microsoft.VSDesigner.Data.VS.DataViewManagerDesigner, " + AssemblyRef.MicrosoftVSDesigner) 20 ] 21 public class DataViewManager : MarshalByValueComponent, IBindingList, System.ComponentModel.ITypedList { 22 private DataViewSettingCollection dataViewSettingsCollection; 23 private DataSet dataSet; 24 private DataViewManagerListItemTypeDescriptor item; 25 private bool locked; 26 internal int nViews = 0; 27 28 private System.ComponentModel.ListChangedEventHandler onListChanged; 29 30 private static NotSupportedException NotSupported = new NotSupportedException(); 31 DataViewManager()32 public DataViewManager() : this(null, false) {} 33 DataViewManager(DataSet dataSet)34 public DataViewManager(DataSet dataSet) : this(dataSet, false) {} 35 DataViewManager(DataSet dataSet, bool locked)36 internal DataViewManager(DataSet dataSet, bool locked) { 37 GC.SuppressFinalize(this); 38 this.dataSet = dataSet; 39 if (this.dataSet != null) { 40 this.dataSet.Tables.CollectionChanged += new CollectionChangeEventHandler(TableCollectionChanged); 41 this.dataSet.Relations.CollectionChanged += new CollectionChangeEventHandler(RelationCollectionChanged); 42 } 43 this.locked = locked; 44 this.item = new DataViewManagerListItemTypeDescriptor(this); 45 this.dataViewSettingsCollection = new DataViewSettingCollection(this); 46 } 47 48 [ 49 DefaultValue(null), 50 ResDescriptionAttribute(Res.DataViewManagerDataSetDescr) 51 ] 52 public DataSet DataSet { 53 get { 54 return dataSet; 55 } 56 set { 57 if (value == null) 58 throw ExceptionBuilder.SetFailed("DataSet to null"); 59 60 if (locked) 61 throw ExceptionBuilder.SetDataSetFailed(); 62 63 if (dataSet != null) { 64 if (nViews > 0) 65 throw ExceptionBuilder.CanNotSetDataSet(); 66 67 this.dataSet.Tables.CollectionChanged -= new CollectionChangeEventHandler(TableCollectionChanged); 68 this.dataSet.Relations.CollectionChanged -= new CollectionChangeEventHandler(RelationCollectionChanged); 69 } 70 71 this.dataSet = value; 72 this.dataSet.Tables.CollectionChanged += new CollectionChangeEventHandler(TableCollectionChanged); 73 this.dataSet.Relations.CollectionChanged += new CollectionChangeEventHandler(RelationCollectionChanged); 74 this.dataViewSettingsCollection = new DataViewSettingCollection(this); 75 item.Reset(); 76 } 77 } 78 79 [ 80 DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 81 ResDescriptionAttribute(Res.DataViewManagerTableSettingsDescr) 82 ] 83 public DataViewSettingCollection DataViewSettings { 84 get { 85 return dataViewSettingsCollection; 86 } 87 } 88 89 public string DataViewSettingCollectionString { 90 get { 91 if (dataSet == null) 92 return ""; 93 94 StringBuilder builder = new StringBuilder(); 95 builder.Append("<DataViewSettingCollectionString>"); 96 foreach (DataTable dt in dataSet.Tables) { 97 DataViewSetting ds = dataViewSettingsCollection[dt]; 98 builder.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "<{0} Sort=\"{1}\" RowFilter=\"{2}\" RowStateFilter=\"{3}\"/>", dt.EncodedTableName, ds.Sort, ds.RowFilter, ds.RowStateFilter); 99 } 100 builder.Append("</DataViewSettingCollectionString>"); 101 return builder.ToString(); 102 } 103 set { 104 if (value == null || value.Length == 0) 105 return; 106 107 XmlTextReader r = new XmlTextReader(new StringReader(value)); 108 r.WhitespaceHandling = WhitespaceHandling.None; 109 r.Read(); 110 if (r.Name != "DataViewSettingCollectionString") 111 throw ExceptionBuilder.SetFailed("DataViewSettingCollectionString"); 112 while (r.Read()) { 113 if (r.NodeType != XmlNodeType.Element) 114 continue; 115 116 string table = XmlConvert.DecodeName(r.LocalName); 117 if (r.MoveToAttribute("Sort")) 118 dataViewSettingsCollection[table].Sort = r.Value; 119 120 if (r.MoveToAttribute("RowFilter")) 121 dataViewSettingsCollection[table].RowFilter = r.Value; 122 123 if (r.MoveToAttribute("RowStateFilter")) 124 dataViewSettingsCollection[table].RowStateFilter = (DataViewRowState)Enum.Parse(typeof(DataViewRowState),r.Value); 125 } 126 } 127 } 128 IEnumerable.GetEnumerator()129 IEnumerator IEnumerable.GetEnumerator() { 130 DataViewManagerListItemTypeDescriptor[] items = new DataViewManagerListItemTypeDescriptor[1]; 131 ((ICollection)this).CopyTo(items, 0); 132 return items.GetEnumerator(); 133 } 134 135 int ICollection.Count { 136 get { 137 return 1; 138 } 139 } 140 141 object ICollection.SyncRoot { 142 get { 143 return this; 144 } 145 } 146 147 bool ICollection.IsSynchronized { 148 get { 149 return false; 150 } 151 } 152 153 bool IList.IsReadOnly { 154 get { 155 return true; 156 } 157 } 158 159 bool IList.IsFixedSize { 160 get { 161 return true; 162 } 163 } 164 ICollection.CopyTo(Array array, int index)165 void ICollection.CopyTo(Array array, int index) { 166 array.SetValue((object)(new DataViewManagerListItemTypeDescriptor(this)), index); 167 } 168 169 object IList.this[int index] { 170 get { 171 return item; 172 } 173 set { 174 throw ExceptionBuilder.CannotModifyCollection(); 175 } 176 } 177 IList.Add(object value)178 int IList.Add(object value) { 179 throw ExceptionBuilder.CannotModifyCollection(); 180 } 181 IList.Clear()182 void IList.Clear() { 183 throw ExceptionBuilder.CannotModifyCollection(); 184 } 185 IList.Contains(object value)186 bool IList.Contains(object value) { 187 return(value == item); 188 } 189 IList.IndexOf(object value)190 int IList.IndexOf(object value) { 191 return(value == item) ? 1 : -1; 192 } 193 IList.Insert(int index, object value)194 void IList.Insert(int index, object value) { 195 throw ExceptionBuilder.CannotModifyCollection(); 196 } 197 IList.Remove(object value)198 void IList.Remove(object value) { 199 throw ExceptionBuilder.CannotModifyCollection(); 200 } 201 IList.RemoveAt(int index)202 void IList.RemoveAt(int index) { 203 throw ExceptionBuilder.CannotModifyCollection(); 204 } 205 206 // ------------- IBindingList: --------------------------- 207 208 bool IBindingList.AllowNew { 209 get { 210 return false; 211 } 212 } IBindingList.AddNew()213 object IBindingList.AddNew() { 214 throw NotSupported; 215 } 216 217 bool IBindingList.AllowEdit { 218 get { 219 return false; 220 } 221 } 222 223 bool IBindingList.AllowRemove { 224 get { 225 return false; 226 } 227 } 228 229 bool IBindingList.SupportsChangeNotification { 230 get { 231 return true; 232 } 233 } 234 235 bool IBindingList.SupportsSearching { 236 get { 237 return false; 238 } 239 } 240 241 bool IBindingList.SupportsSorting { 242 get { 243 return false; 244 } 245 } 246 247 bool IBindingList.IsSorted { 248 get { 249 throw NotSupported; 250 } 251 } 252 253 PropertyDescriptor IBindingList.SortProperty { 254 get { 255 throw NotSupported; 256 } 257 } 258 259 ListSortDirection IBindingList.SortDirection { 260 get { 261 throw NotSupported; 262 } 263 } 264 265 public event System.ComponentModel.ListChangedEventHandler ListChanged { 266 add { 267 onListChanged += value; 268 } 269 remove { 270 onListChanged -= value; 271 } 272 } 273 IBindingList.AddIndex(PropertyDescriptor property)274 void IBindingList.AddIndex(PropertyDescriptor property) { 275 // no operation 276 } 277 IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction)278 void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { 279 throw NotSupported; 280 } 281 IBindingList.Find(PropertyDescriptor property, object key)282 int IBindingList.Find(PropertyDescriptor property, object key) { 283 throw NotSupported; 284 } 285 IBindingList.RemoveIndex(PropertyDescriptor property)286 void IBindingList.RemoveIndex(PropertyDescriptor property) { 287 // no operation 288 } 289 IBindingList.RemoveSort()290 void IBindingList.RemoveSort() { 291 throw NotSupported; 292 } 293 294 /* 295 string IBindingList.GetListName() { 296 return ((System.Data.ITypedList)this).GetListName(null); 297 } 298 string IBindingList.GetListName(PropertyDescriptor[] listAccessors) { 299 return ((System.Data.ITypedList)this).GetListName(listAccessors); 300 } 301 */ 302 303 // Microsoft: GetListName and GetItemProperties almost the same in DataView and DataViewManager System.ComponentModel.ITypedList.GetListName(PropertyDescriptor[] listAccessors)304 string System.ComponentModel.ITypedList.GetListName(PropertyDescriptor[] listAccessors) { 305 DataSet dataSet = DataSet; 306 if (dataSet == null) 307 throw ExceptionBuilder.CanNotUseDataViewManager(); 308 309 if (listAccessors == null || listAccessors.Length == 0) { 310 return dataSet.DataSetName; 311 } 312 else { 313 DataTable table = dataSet.FindTable(null, listAccessors, 0); 314 if (table != null) { 315 return table.TableName; 316 } 317 } 318 return String.Empty; 319 } 320 System.ComponentModel.ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)321 PropertyDescriptorCollection System.ComponentModel.ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) { 322 DataSet dataSet = DataSet; 323 if (dataSet == null) 324 throw ExceptionBuilder.CanNotUseDataViewManager(); 325 326 if (listAccessors == null || listAccessors.Length == 0) { 327 return((ICustomTypeDescriptor)(new DataViewManagerListItemTypeDescriptor(this))).GetProperties(); 328 } 329 else { 330 DataTable table = dataSet.FindTable(null, listAccessors, 0); 331 if (table != null) { 332 return table.GetPropertyDescriptorCollection(null); 333 } 334 } 335 return new PropertyDescriptorCollection(null); 336 } 337 CreateDataView(DataTable table)338 public DataView CreateDataView(DataTable table) { 339 if (dataSet == null) 340 throw ExceptionBuilder.CanNotUseDataViewManager(); 341 342 DataView dataView = new DataView(table); 343 dataView.SetDataViewManager(this); 344 return dataView; 345 } 346 OnListChanged(ListChangedEventArgs e)347 protected virtual void OnListChanged(ListChangedEventArgs e) { 348 try { 349 if (onListChanged != null) { 350 onListChanged(this, e); 351 } 352 } 353 catch (Exception f) { 354 // 355 if (!Common.ADP.IsCatchableExceptionType(f)) { 356 throw; 357 } 358 ExceptionBuilder.TraceExceptionWithoutRethrow(f); 359 // ignore the exception 360 } 361 } 362 TableCollectionChanged(object sender, CollectionChangeEventArgs e)363 protected virtual void TableCollectionChanged(object sender, CollectionChangeEventArgs e) { 364 PropertyDescriptor NullProp = null; 365 OnListChanged( 366 e.Action == CollectionChangeAction.Add ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataTablePropertyDescriptor((System.Data.DataTable)e.Element)) : 367 e.Action == CollectionChangeAction.Refresh ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, NullProp) : 368 e.Action == CollectionChangeAction.Remove ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataTablePropertyDescriptor((System.Data.DataTable)e.Element)) : 369 /*default*/ null 370 ); 371 } 372 RelationCollectionChanged(object sender, CollectionChangeEventArgs e)373 protected virtual void RelationCollectionChanged(object sender, CollectionChangeEventArgs e) { 374 DataRelationPropertyDescriptor NullProp = null; 375 OnListChanged( 376 e.Action == CollectionChangeAction.Add ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataRelationPropertyDescriptor((System.Data.DataRelation)e.Element)) : 377 e.Action == CollectionChangeAction.Refresh ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, NullProp): 378 e.Action == CollectionChangeAction.Remove ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataRelationPropertyDescriptor((System.Data.DataRelation)e.Element)) : 379 /*default*/ null 380 ); 381 } 382 } 383 } 384