536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
384 lines
13 KiB
C#
384 lines
13 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DataViewManager.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
|
// <owner current="true" primary="false">Microsoft</owner>
|
|
// <owner current="false" primary="false">Microsoft</owner>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Data {
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Xml;
|
|
|
|
[
|
|
Designer("Microsoft.VSDesigner.Data.VS.DataViewManagerDesigner, " + AssemblyRef.MicrosoftVSDesigner)
|
|
]
|
|
public class DataViewManager : MarshalByValueComponent, IBindingList, System.ComponentModel.ITypedList {
|
|
private DataViewSettingCollection dataViewSettingsCollection;
|
|
private DataSet dataSet;
|
|
private DataViewManagerListItemTypeDescriptor item;
|
|
private bool locked;
|
|
internal int nViews = 0;
|
|
|
|
private System.ComponentModel.ListChangedEventHandler onListChanged;
|
|
|
|
private static NotSupportedException NotSupported = new NotSupportedException();
|
|
|
|
public DataViewManager() : this(null, false) {}
|
|
|
|
public DataViewManager(DataSet dataSet) : this(dataSet, false) {}
|
|
|
|
internal DataViewManager(DataSet dataSet, bool locked) {
|
|
GC.SuppressFinalize(this);
|
|
this.dataSet = dataSet;
|
|
if (this.dataSet != null) {
|
|
this.dataSet.Tables.CollectionChanged += new CollectionChangeEventHandler(TableCollectionChanged);
|
|
this.dataSet.Relations.CollectionChanged += new CollectionChangeEventHandler(RelationCollectionChanged);
|
|
}
|
|
this.locked = locked;
|
|
this.item = new DataViewManagerListItemTypeDescriptor(this);
|
|
this.dataViewSettingsCollection = new DataViewSettingCollection(this);
|
|
}
|
|
|
|
[
|
|
DefaultValue(null),
|
|
ResDescriptionAttribute(Res.DataViewManagerDataSetDescr)
|
|
]
|
|
public DataSet DataSet {
|
|
get {
|
|
return dataSet;
|
|
}
|
|
set {
|
|
if (value == null)
|
|
throw ExceptionBuilder.SetFailed("DataSet to null");
|
|
|
|
if (locked)
|
|
throw ExceptionBuilder.SetDataSetFailed();
|
|
|
|
if (dataSet != null) {
|
|
if (nViews > 0)
|
|
throw ExceptionBuilder.CanNotSetDataSet();
|
|
|
|
this.dataSet.Tables.CollectionChanged -= new CollectionChangeEventHandler(TableCollectionChanged);
|
|
this.dataSet.Relations.CollectionChanged -= new CollectionChangeEventHandler(RelationCollectionChanged);
|
|
}
|
|
|
|
this.dataSet = value;
|
|
this.dataSet.Tables.CollectionChanged += new CollectionChangeEventHandler(TableCollectionChanged);
|
|
this.dataSet.Relations.CollectionChanged += new CollectionChangeEventHandler(RelationCollectionChanged);
|
|
this.dataViewSettingsCollection = new DataViewSettingCollection(this);
|
|
item.Reset();
|
|
}
|
|
}
|
|
|
|
[
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
|
|
ResDescriptionAttribute(Res.DataViewManagerTableSettingsDescr)
|
|
]
|
|
public DataViewSettingCollection DataViewSettings {
|
|
get {
|
|
return dataViewSettingsCollection;
|
|
}
|
|
}
|
|
|
|
public string DataViewSettingCollectionString {
|
|
get {
|
|
if (dataSet == null)
|
|
return "";
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
builder.Append("<DataViewSettingCollectionString>");
|
|
foreach (DataTable dt in dataSet.Tables) {
|
|
DataViewSetting ds = dataViewSettingsCollection[dt];
|
|
builder.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "<{0} Sort=\"{1}\" RowFilter=\"{2}\" RowStateFilter=\"{3}\"/>", dt.EncodedTableName, ds.Sort, ds.RowFilter, ds.RowStateFilter);
|
|
}
|
|
builder.Append("</DataViewSettingCollectionString>");
|
|
return builder.ToString();
|
|
}
|
|
set {
|
|
if (value == null || value.Length == 0)
|
|
return;
|
|
|
|
XmlTextReader r = new XmlTextReader(new StringReader(value));
|
|
r.WhitespaceHandling = WhitespaceHandling.None;
|
|
r.Read();
|
|
if (r.Name != "DataViewSettingCollectionString")
|
|
throw ExceptionBuilder.SetFailed("DataViewSettingCollectionString");
|
|
while (r.Read()) {
|
|
if (r.NodeType != XmlNodeType.Element)
|
|
continue;
|
|
|
|
string table = XmlConvert.DecodeName(r.LocalName);
|
|
if (r.MoveToAttribute("Sort"))
|
|
dataViewSettingsCollection[table].Sort = r.Value;
|
|
|
|
if (r.MoveToAttribute("RowFilter"))
|
|
dataViewSettingsCollection[table].RowFilter = r.Value;
|
|
|
|
if (r.MoveToAttribute("RowStateFilter"))
|
|
dataViewSettingsCollection[table].RowStateFilter = (DataViewRowState)Enum.Parse(typeof(DataViewRowState),r.Value);
|
|
}
|
|
}
|
|
}
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() {
|
|
DataViewManagerListItemTypeDescriptor[] items = new DataViewManagerListItemTypeDescriptor[1];
|
|
((ICollection)this).CopyTo(items, 0);
|
|
return items.GetEnumerator();
|
|
}
|
|
|
|
int ICollection.Count {
|
|
get {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
object ICollection.SyncRoot {
|
|
get {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
bool ICollection.IsSynchronized {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IList.IsReadOnly {
|
|
get {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool IList.IsFixedSize {
|
|
get {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
void ICollection.CopyTo(Array array, int index) {
|
|
array.SetValue((object)(new DataViewManagerListItemTypeDescriptor(this)), index);
|
|
}
|
|
|
|
object IList.this[int index] {
|
|
get {
|
|
return item;
|
|
}
|
|
set {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
}
|
|
|
|
int IList.Add(object value) {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
|
|
void IList.Clear() {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
|
|
bool IList.Contains(object value) {
|
|
return(value == item);
|
|
}
|
|
|
|
int IList.IndexOf(object value) {
|
|
return(value == item) ? 1 : -1;
|
|
}
|
|
|
|
void IList.Insert(int index, object value) {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
|
|
void IList.Remove(object value) {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
|
|
void IList.RemoveAt(int index) {
|
|
throw ExceptionBuilder.CannotModifyCollection();
|
|
}
|
|
|
|
// ------------- IBindingList: ---------------------------
|
|
|
|
bool IBindingList.AllowNew {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
object IBindingList.AddNew() {
|
|
throw NotSupported;
|
|
}
|
|
|
|
bool IBindingList.AllowEdit {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IBindingList.AllowRemove {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IBindingList.SupportsChangeNotification {
|
|
get {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool IBindingList.SupportsSearching {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IBindingList.SupportsSorting {
|
|
get {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IBindingList.IsSorted {
|
|
get {
|
|
throw NotSupported;
|
|
}
|
|
}
|
|
|
|
PropertyDescriptor IBindingList.SortProperty {
|
|
get {
|
|
throw NotSupported;
|
|
}
|
|
}
|
|
|
|
ListSortDirection IBindingList.SortDirection {
|
|
get {
|
|
throw NotSupported;
|
|
}
|
|
}
|
|
|
|
public event System.ComponentModel.ListChangedEventHandler ListChanged {
|
|
add {
|
|
onListChanged += value;
|
|
}
|
|
remove {
|
|
onListChanged -= value;
|
|
}
|
|
}
|
|
|
|
void IBindingList.AddIndex(PropertyDescriptor property) {
|
|
// no operation
|
|
}
|
|
|
|
void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) {
|
|
throw NotSupported;
|
|
}
|
|
|
|
int IBindingList.Find(PropertyDescriptor property, object key) {
|
|
throw NotSupported;
|
|
}
|
|
|
|
void IBindingList.RemoveIndex(PropertyDescriptor property) {
|
|
// no operation
|
|
}
|
|
|
|
void IBindingList.RemoveSort() {
|
|
throw NotSupported;
|
|
}
|
|
|
|
/*
|
|
string IBindingList.GetListName() {
|
|
return ((System.Data.ITypedList)this).GetListName(null);
|
|
}
|
|
string IBindingList.GetListName(PropertyDescriptor[] listAccessors) {
|
|
return ((System.Data.ITypedList)this).GetListName(listAccessors);
|
|
}
|
|
*/
|
|
|
|
// Microsoft: GetListName and GetItemProperties almost the same in DataView and DataViewManager
|
|
string System.ComponentModel.ITypedList.GetListName(PropertyDescriptor[] listAccessors) {
|
|
DataSet dataSet = DataSet;
|
|
if (dataSet == null)
|
|
throw ExceptionBuilder.CanNotUseDataViewManager();
|
|
|
|
if (listAccessors == null || listAccessors.Length == 0) {
|
|
return dataSet.DataSetName;
|
|
}
|
|
else {
|
|
DataTable table = dataSet.FindTable(null, listAccessors, 0);
|
|
if (table != null) {
|
|
return table.TableName;
|
|
}
|
|
}
|
|
return String.Empty;
|
|
}
|
|
|
|
PropertyDescriptorCollection System.ComponentModel.ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) {
|
|
DataSet dataSet = DataSet;
|
|
if (dataSet == null)
|
|
throw ExceptionBuilder.CanNotUseDataViewManager();
|
|
|
|
if (listAccessors == null || listAccessors.Length == 0) {
|
|
return((ICustomTypeDescriptor)(new DataViewManagerListItemTypeDescriptor(this))).GetProperties();
|
|
}
|
|
else {
|
|
DataTable table = dataSet.FindTable(null, listAccessors, 0);
|
|
if (table != null) {
|
|
return table.GetPropertyDescriptorCollection(null);
|
|
}
|
|
}
|
|
return new PropertyDescriptorCollection(null);
|
|
}
|
|
|
|
public DataView CreateDataView(DataTable table) {
|
|
if (dataSet == null)
|
|
throw ExceptionBuilder.CanNotUseDataViewManager();
|
|
|
|
DataView dataView = new DataView(table);
|
|
dataView.SetDataViewManager(this);
|
|
return dataView;
|
|
}
|
|
|
|
protected virtual void OnListChanged(ListChangedEventArgs e) {
|
|
try {
|
|
if (onListChanged != null) {
|
|
onListChanged(this, e);
|
|
}
|
|
}
|
|
catch (Exception f) {
|
|
//
|
|
if (!Common.ADP.IsCatchableExceptionType(f)) {
|
|
throw;
|
|
}
|
|
ExceptionBuilder.TraceExceptionWithoutRethrow(f);
|
|
// ignore the exception
|
|
}
|
|
}
|
|
|
|
protected virtual void TableCollectionChanged(object sender, CollectionChangeEventArgs e) {
|
|
PropertyDescriptor NullProp = null;
|
|
OnListChanged(
|
|
e.Action == CollectionChangeAction.Add ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataTablePropertyDescriptor((System.Data.DataTable)e.Element)) :
|
|
e.Action == CollectionChangeAction.Refresh ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, NullProp) :
|
|
e.Action == CollectionChangeAction.Remove ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataTablePropertyDescriptor((System.Data.DataTable)e.Element)) :
|
|
/*default*/ null
|
|
);
|
|
}
|
|
|
|
protected virtual void RelationCollectionChanged(object sender, CollectionChangeEventArgs e) {
|
|
DataRelationPropertyDescriptor NullProp = null;
|
|
OnListChanged(
|
|
e.Action == CollectionChangeAction.Add ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorAdded, new DataRelationPropertyDescriptor((System.Data.DataRelation)e.Element)) :
|
|
e.Action == CollectionChangeAction.Refresh ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, NullProp):
|
|
e.Action == CollectionChangeAction.Remove ? new ListChangedEventArgs(ListChangedType.PropertyDescriptorDeleted, new DataRelationPropertyDescriptor((System.Data.DataRelation)e.Element)) :
|
|
/*default*/ null
|
|
);
|
|
}
|
|
}
|
|
}
|