我以数据DataSet
的形式来自数据库。然后我在执行DataSource
之前将其设置为网格控件的DataBind()
。我想在一列上对DataSet
/ DataTable
进行排序。该列要复杂以在数据库中排序,但我希望我可以对它进行排序,就像我要对通用列表进行排序,即使用deligate。
这是可能的还是我必须将其转移到不同的数据结构?
编辑我无法让这些答案适合我,我想因为我使用 .Net 2.0。
答案 0 :(得分:6)
由于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等),您可以使用List<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)
答案 1 :(得分:3)
我认为DataView.Sort属性会有所帮助。您可以通过DataTable.DefaultView访问它。
答案 2 :(得分:2)
如果您不介意在控件上丢失分页/排序,可以使用以下内容:
var dt = new DataTable();
gvWhatever.DataSource = dt.Select().ToList().Sort();
根据重载,这种类型会占用IComparables等,所以你可以随意排序。
答案 3 :(得分:1)
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();
}
}
答案 4 :(得分:0)
您可以在内存中对数据库进行排序,但我不知道“在数据库中排序太复杂”会是什么。如果我是你,我会尝试在数据库中对它进行排序,使用视图,冗余索引,复杂的SQL语句,它可能比在内存中对大型数据集进行排序更快,还有一个额外的好处就是它可以保持其他数据集的排序。客户类型(例如Web服务等)
答案 5 :(得分:0)
为什么列要复杂以在数据库中进行排序?它假设排序的复杂性在数据库或框架中是相同的,除非它当然是计算列,即使在这种情况下,我猜测在DB中的排序仍然更快。
但是,正如John所说,您可以通过DataView.Sort属性更改表单级别的排序。如果耗费太多时间,我建议这样做,在这种情况下,缓存结果会很有用。
答案 6 :(得分:0)
你可以通过
来完成myTableName.DefaultView.Sort = "MyFieldName DESC";