针对 ObjectDataSource 的客户对象通用排序 (ASP.NET)






3.77/5 (7投票s)
在 ASP.NET 中针对 ObjectDataSource 的客户对象通用排序。
引言
PropertyComparer
类为数据访问组件提供了在利用 ObjectDataSource
时启用客户对象排序的可能性。
背景
ASP.NET 2.0 包含 GridView
和 ObjectDataSource
控制。您可以定义 ObjectDataSource
使用数据访问组件的哪些方法。如果 Select
方法返回 DataSet
或 DataTable
,则可以开箱即用地为 GridView
使用分页和排序。
如果您想使用业务对象集合而不是 DataSet
/DataTable
,则必须自己实现排序。我编写了一个通用比较器,用于所有我的业务对象。
使用代码
使用一个 GridView
,其中定义了 DataSourceId
,并启用排序
<asp:GridView ID="exampleGridView" runat="server"
DataSourceID="exampleDataSource"
AllowSorting="True" ... >
定义 ObjectDataSource
<asp:ObjectDataSource ID="exampleDataSource" runat="server"
TypeName="ExampleDataAccessComponent"
SelectMethod="Select"
SortParameterName="orderBy" ... >
编写实现 Select
方法的数据访问组件
[DataObject()]
public sealed class ActivityDac
{
private string myConnectionString;
private DbProviderFactory myFactory;
public ActivityDac()
{
ConnectionStringSettings cs =
ConfigurationManager.ConnectionStrings[" ... "];
myFactory = DbProviderFactories.GetFactory(cs.ProviderName);
myConnectionString = cs.ConnectionString;
}
[DataObjectMethod(DataObjectMethodType.Select, true)]
public Activity[] Select(string orderBy)
{
List<BusinessClass> list = new List<BusinessClass>();
using (DbConnection con = myFactory.CreateConnection())
{
con.ConnectionString = myConnectionString;
using (DbCommand cmd = myFactory.CreateCommand())
{
cmd.Connection = con;
cmd.CommandText = " ... ";
DbParameter p = myFactory.CreateParameter();
...
cmd.Parameters.Add(p);
con.Open();
DbDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleResult);
while (reader.Read())
{
BusinessClass o = new BusinessClass(reader.GetInt32(0));
..
list.Add(o);
}
}
}
if (!String.IsNullOrEmpty(orderBy))
{
PropertyComparer<BusinessClass> comparer =
new PropertyComparer<BusinessClass>(orderBy);
list.Sort(comparer);
}
return list.ToArray();
}
}
以下是 PropertyComparer
的代码
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Collections;
namespace Example
{
public class PropertyComparer<T> : IComparer<T>
{
private enum SortType
{
Descending = -1,
Ascending = 1
}
private SortType mySortDirecton;
private string mySortPropertyName;
public PropertyComparer(string sortString)
{
if (sortString == null)
throw new ArgumentNullException("sortString");
if (sortString.Length == 0)
throw new ArgumentOutOfRangeException("sortString");
if (sortString.ToLower().EndsWith(" desc"))
{
mySortPropertyName = sortString.Substring(0, sortString.Length - 5);
mySortDirecton = SortType.Descending;
}
else
{
if (sortString.ToLower().EndsWith(" asc"))
mySortPropertyName = sortString.Substring(0, sortString.Length - 4);
else
this.mySortPropertyName = sortString;
this.mySortDirecton = SortType.Ascending;
}
}
#region IComparer<T> Members
public int Compare(T x, T y)
{
if ((x == null) && (y == null))
return 0;
if (x == null)
return -(int)mySortDirecton;
if (y == null)
return (int)mySortDirecton;
PropertyInfo p = x.GetType().GetProperty(mySortPropertyName);
if (p == null)
throw new ApplicationException();
object vX = p.GetValue(x, null);
object vY = p.GetValue(y, null);
if ((vX == null) && (vY == null))
return 0;
if (vX == null)
return -(int)mySortDirecton;
if (vY == null)
return (int)mySortDirecton;
return (int)mySortDirecton * Comparer.DefaultInvariant.Compare(vX, vY);
}
#endregion
}
}
历史
- 2008 年 10 月 24 日:9:23 - 更正了拼写错误。