我有来自数据库的数据,格式为DataSet
. 然后我将其设置为DataSource
网格控件,然后再执行DataBind()
. 我想在一列上对DataSet
/进行排序。DataTable
该列在数据库中排序很复杂,但我希望我可以像对通用列表进行排序一样对它进行排序,即使用 deligate。
这是可能的还是我必须将它转移到不同的数据结构?
编辑我无法得到任何适合我的答案,我想是因为我使用的是.Net 2.0。
我有来自数据库的数据,格式为DataSet
. 然后我将其设置为DataSource
网格控件,然后再执行DataBind()
. 我想在一列上对DataSet
/进行排序。DataTable
该列在数据库中排序很复杂,但我希望我可以像对通用列表进行排序一样对它进行排序,即使用 deligate。
这是可能的还是我必须将它转移到不同的数据结构?
编辑我无法得到任何适合我的答案,我想是因为我使用的是.Net 2.0。
由于 DataTable(和 DataView)排序的工作原理,您不能直接使用委托方法。一种解决方法是向数据表中添加表示订单的列,并根据所需的顺序设置值(每行)。然后,您可以将排序添加到此新列的视图中。例如(为了简洁起见,使用 LINQ 进行排序):
var sorted = table.Rows.Cast<DataRow>().OrderBy(row => your code);
int sequence = 0;
foreach(var row in sorted)
{
row["sequence"] = sequence++;
}
(如果你有一个类型化的数据集,那么我认为你不需要 Cast 步骤,或者你会使用你的类型化 DataRow 子类)
[编辑以包括 2.0]
在 2.0(即没有 LINQ 等)中,您可以使用 aList<T>
进行排序 - 有点冗长,但是:
List<DataRow> sorted = new List<DataRow>();
foreach(DataRow row in table.Rows)
{
sorted.Add(row);
}
sorted.Sort(delegate(DataRow x, DataRow y) { your code });
int sequence = 0;
foreach(DataRow row in sorted)
{
row["sequence"] = sequence++;
}
(再次,如果您使用的是类型化数据集,请替换 DataRow)
我认为DataView.Sort属性会有所帮助。您可以通过DataTable.DefaultView访问它。
如果您不介意在控件上丢失分页/排序,您可以使用以下内容:
var dt = new DataTable();
gvWhatever.DataSource = dt.Select().ToList().Sort();
并且这种排序将根据重载采用 IComparables 等,因此您可以随意排序。
你可以这样做
myTableName.DefaultView.Sort = "MyFieldName DESC";
protected void grdResult_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = ((DataTable)Session["myDatatable"]);
grdResult.DataSource = dt;
DataTable dataTable = grdResult.DataSource as DataTable;
//Code added to fix issue with sorting for Date datatype fields
if (dataTable != null)
{
DataView dataView = new DataView(dataTable);
for (int i = 0; i < dataView.Table.Rows.Count; i++)
{
try
{
dataView.Table.Rows[i]["RESP_DUE_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RESP_DUE_DT"]));
dataView.Table.Rows[i]["RECD_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RECD_DT"]));
}
catch (Exception ex)
{
}
}
dataView.Sort = "[" + e.SortExpression + "]" + " " + GetSortDirection(e.SortExpression);
for (int i = 0; i < dataView.Table.Rows.Count; i++)
{
try
{
dataView.AllowEdit = true;
dataView[i].BeginEdit();
dataView[i]["RESP_DUE_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RESP_DUE_DT"].ToString());
dataView[i]["RECD_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RECD_DT"].ToString());
}
catch (Exception ex)
{
}
}
//End code added to fix the issue with sorting for Date data type fields
grdResult.DataSource = dataView;
grdResult.DataBind();
}
}
您可以在内存中对数据库进行排序,但我不知道“在数据库中排序太复杂”会是什么。如果我是你,我会尝试在数据库中对其进行排序,使用视图、冗余索引、复杂的 SQL 语句,它可能会比在内存中对大型数据集进行排序更快,并具有额外的优势,它可以为其他人保留排序客户端类型(例如 Web 服务等)
为什么要在数据库中对列进行复杂排序?它假设排序的复杂性在数据库或框架中将是相同的,除非它当然是一个计算列,即使在这种情况下,我猜测在数据库中排序仍然更快。
但是,正如 John 所说,您可以通过 DataView.Sort 属性更改表单级别的排序。如果耗时过多,我建议这样做,在这种情况下,缓存结果会很有用。