Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SortableBindingList.cs / 1 / SortableBindingList.cs
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Collections;
using System.Reflection;
using System.Xml.Linq;
namespace System.Data.Linq
{
///
/// Adds sorting feature to BindingList
///
///
internal class SortableBindingList : BindingList {
internal SortableBindingList(IList list) : base(list) { }
private bool isSorted = false;
private PropertyDescriptor sortProperty = null;
private ListSortDirection sortDirection = ListSortDirection.Ascending;
protected override void RemoveSortCore() {
isSorted = false;
sortProperty = null;
}
protected override ListSortDirection SortDirectionCore {
get { return sortDirection; }
}
protected override PropertyDescriptor SortPropertyCore {
get { return sortProperty; }
}
protected override bool IsSortedCore {
get { return isSorted; }
}
protected override bool SupportsSortingCore {
get { return true; }
}
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) {
//Only apply sort if the column is sortable, decision was made not to throw in this case.
//Don't prevent nullable types from working.
Type propertyType = prop.PropertyType;
if (PropertyComparer.IsAllowable(propertyType))
{
((List)this.Items).Sort(new PropertyComparer(prop, direction));
sortDirection = direction;
sortProperty = prop;
isSorted = true;
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
internal class PropertyComparer : Comparer {
private PropertyDescriptor prop;
private IComparer comparer;
private ListSortDirection direction;
private bool useToString;
internal PropertyComparer(PropertyDescriptor prop, ListSortDirection direction) {
if (prop.ComponentType != typeof(T)) {
throw new MissingMemberException(typeof(T).Name, prop.Name);
}
this.prop = prop;
this.direction = direction;
if (OkWithIComparable(prop.PropertyType)) {
Type comparerType = typeof(Comparer<>).MakeGenericType(prop.PropertyType);
PropertyInfo defaultComparer = comparerType.GetProperty("Default");
comparer = (IComparer)defaultComparer.GetValue(null, null);
useToString = false;
}
else if (OkWithToString(prop.PropertyType)) {
comparer = StringComparer.CurrentCultureIgnoreCase;
useToString = true;
}
}
public override int Compare(T x, T y) {
object xValue = prop.GetValue(x);
object yValue = prop.GetValue(y);
if (useToString) {
xValue = xValue != null ? xValue.ToString() : null;
yValue = yValue != null ? yValue.ToString() : null;
}
if (direction == ListSortDirection.Ascending) {
return comparer.Compare(xValue, yValue);
}
else {
return comparer.Compare(yValue, xValue);
}
}
protected static bool OkWithToString(Type t) {
// this is the list of types that behave specially for the purpose of
// sorting. if we have a property of this type, and it does not implement
// IComparable, then this class will sort the properties according to the
// ToString() method.
// In the case of an XNode, the ToString() returns the
// XML, which is what we care about.
return (t.Equals(typeof(XNode)) || t.IsSubclassOf(typeof(XNode)));
}
protected static bool OkWithIComparable(Type t) {
return (t.GetInterface("IComparable") != null)
|| (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}
public static bool IsAllowable(Type t) {
return OkWithToString(t) || OkWithIComparable(t);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Collections;
using System.Reflection;
using System.Xml.Linq;
namespace System.Data.Linq
{
///
/// Adds sorting feature to BindingList
///
///
internal class SortableBindingList : BindingList {
internal SortableBindingList(IList list) : base(list) { }
private bool isSorted = false;
private PropertyDescriptor sortProperty = null;
private ListSortDirection sortDirection = ListSortDirection.Ascending;
protected override void RemoveSortCore() {
isSorted = false;
sortProperty = null;
}
protected override ListSortDirection SortDirectionCore {
get { return sortDirection; }
}
protected override PropertyDescriptor SortPropertyCore {
get { return sortProperty; }
}
protected override bool IsSortedCore {
get { return isSorted; }
}
protected override bool SupportsSortingCore {
get { return true; }
}
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) {
//Only apply sort if the column is sortable, decision was made not to throw in this case.
//Don't prevent nullable types from working.
Type propertyType = prop.PropertyType;
if (PropertyComparer.IsAllowable(propertyType))
{
((List)this.Items).Sort(new PropertyComparer(prop, direction));
sortDirection = direction;
sortProperty = prop;
isSorted = true;
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
internal class PropertyComparer : Comparer {
private PropertyDescriptor prop;
private IComparer comparer;
private ListSortDirection direction;
private bool useToString;
internal PropertyComparer(PropertyDescriptor prop, ListSortDirection direction) {
if (prop.ComponentType != typeof(T)) {
throw new MissingMemberException(typeof(T).Name, prop.Name);
}
this.prop = prop;
this.direction = direction;
if (OkWithIComparable(prop.PropertyType)) {
Type comparerType = typeof(Comparer<>).MakeGenericType(prop.PropertyType);
PropertyInfo defaultComparer = comparerType.GetProperty("Default");
comparer = (IComparer)defaultComparer.GetValue(null, null);
useToString = false;
}
else if (OkWithToString(prop.PropertyType)) {
comparer = StringComparer.CurrentCultureIgnoreCase;
useToString = true;
}
}
public override int Compare(T x, T y) {
object xValue = prop.GetValue(x);
object yValue = prop.GetValue(y);
if (useToString) {
xValue = xValue != null ? xValue.ToString() : null;
yValue = yValue != null ? yValue.ToString() : null;
}
if (direction == ListSortDirection.Ascending) {
return comparer.Compare(xValue, yValue);
}
else {
return comparer.Compare(yValue, xValue);
}
}
protected static bool OkWithToString(Type t) {
// this is the list of types that behave specially for the purpose of
// sorting. if we have a property of this type, and it does not implement
// IComparable, then this class will sort the properties according to the
// ToString() method.
// In the case of an XNode, the ToString() returns the
// XML, which is what we care about.
return (t.Equals(typeof(XNode)) || t.IsSubclassOf(typeof(XNode)));
}
protected static bool OkWithIComparable(Type t) {
return (t.GetInterface("IComparable") != null)
|| (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}
public static bool IsAllowable(Type t) {
return OkWithToString(t) || OkWithIComparable(t);
}
}
}
}
// 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
- PersistenceTypeAttribute.cs
- XmlSchemaDatatype.cs
- LocatorManager.cs
- LightweightCodeGenerator.cs
- NoResizeSelectionBorderGlyph.cs
- WmlObjectListAdapter.cs
- ImageCodecInfo.cs
- MultiByteCodec.cs
- IChannel.cs
- VariantWrapper.cs
- OutOfMemoryException.cs
- DbReferenceCollection.cs
- Table.cs
- ConvertBinder.cs
- CaseKeyBox.ViewModel.cs
- PageCache.cs
- Wizard.cs
- NativeMethods.cs
- NetworkInformationException.cs
- PersonalizationStateInfo.cs
- ImplicitInputBrush.cs
- FileInfo.cs
- ValueTypeFixupInfo.cs
- SafeNativeMethods.cs
- XhtmlBasicFormAdapter.cs
- Graph.cs
- ParseNumbers.cs
- ServicesUtilities.cs
- Parallel.cs
- XmlDocumentSerializer.cs
- AssemblyCacheEntry.cs
- SocketElement.cs
- NetMsmqBindingCollectionElement.cs
- BrowserInteropHelper.cs
- UnsafePeerToPeerMethods.cs
- ProfileServiceManager.cs
- ConstraintCollection.cs
- MemberExpressionHelper.cs
- DefaultDialogButtons.cs
- NullableConverter.cs
- Table.cs
- CommandBindingCollection.cs
- TemplateKey.cs
- SubqueryRules.cs
- XmlTypeAttribute.cs
- CallSiteBinder.cs
- CriticalFinalizerObject.cs
- StringFunctions.cs
- ProtectedProviderSettings.cs
- EventDescriptor.cs
- HttpRuntime.cs
- SerializationStore.cs
- ProcessHost.cs
- ImageFormatConverter.cs
- Stylus.cs
- DataGridViewButtonCell.cs
- filewebrequest.cs
- DataGrid.cs
- Stack.cs
- FixedPageProcessor.cs
- CatalogPartDesigner.cs
- MsmqNonTransactedPoisonHandler.cs
- CodeTypeDeclarationCollection.cs
- TreeViewEvent.cs
- __ComObject.cs
- TableLayoutSettingsTypeConverter.cs
- Blend.cs
- UnauthorizedAccessException.cs
- FormsAuthenticationTicket.cs
- ToolboxItemAttribute.cs
- XmlStreamStore.cs
- ApplicationFileParser.cs
- ControlPropertyNameConverter.cs
- ExclusiveTcpTransportManager.cs
- HtmlAnchor.cs
- EncryptRequest.cs
- FixedDocumentSequencePaginator.cs
- LinkedResource.cs
- SemaphoreSecurity.cs
- WSSecurityTokenSerializer.cs
- _AuthenticationState.cs
- CollectionView.cs
- DateTimePicker.cs
- SystemIPInterfaceProperties.cs
- ToolStripDropDownItem.cs
- FormsAuthenticationUser.cs
- IntegrationExceptionEventArgs.cs
- CodeNamespaceImport.cs
- ClientTarget.cs
- UpnEndpointIdentityExtension.cs
- Manipulation.cs
- PackWebRequestFactory.cs
- QueryOutputWriter.cs
- BamlRecordWriter.cs
- FileUtil.cs
- WebPartExportVerb.cs
- ImmutablePropertyDescriptorGridEntry.cs
- DataGridViewRowsRemovedEventArgs.cs
- Brushes.cs
- XmlChildNodes.cs