3

我有来自数据库的数据,格式为DataSet. 然后我将其设置为DataSource网格控件,然后再执行DataBind(). 我想在一列上对DataSet/进行排序。DataTable该列在数据库中排序很复杂,但我希望我可以像对通用列表进行排序一样对它进行排序,即使用 deligate。

这是可能的还是我必须将它转移到不同的数据结构?

编辑我无法得到任何适合我的答案,我想是因为我使用的是.Net 2.0。

4

7 回答 7

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 等)中,您可以使用 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)

于 2008-10-23T07:54:13.137 回答
3

我认为DataView.Sort属性会有所帮助。您可以通过DataTable.DefaultView访问它。

于 2008-10-23T07:50:21.943 回答
2

如果您不介意在控件上丢失分页/排序,您可以使用以下内容:

var dt = new DataTable();
gvWhatever.DataSource = dt.Select().ToList().Sort();

并且这种排序将根据重载采用 IComparables 等,因此您可以随意排序。

于 2008-10-23T07:52:25.030 回答
1

你可以这样做

myTableName.DefaultView.Sort = "MyFieldName DESC";
于 2009-04-17T13:04:44.303 回答
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();


    }
}
于 2010-10-14T16:30:38.353 回答
0

您可以在内存中对数据库进行排序,但我不知道“在数据库中排序太复杂”会是什么。如果我是你,我会尝试在数据库中对其进行排序,使用视图、冗余索引、复杂的 SQL 语句,它可能会比在内存中对大型数据集进行排序更快,并具有额外的优势,它可以为其他人保留排序客户端类型(例如 Web 服务等)

于 2008-10-23T11:21:45.853 回答
0

为什么要在数据库中对列进行复杂排序?它假设排序的复杂性在数据库或框架中将是相同的,除非它当然是一个计算列,即使在这种情况下,我猜测在数据库中排序仍然更快。

但是,正如 John 所说,您可以通过 DataView.Sort 属性更改表单级别的排序。如果耗时过多,我建议这样做,在这种情况下,缓存结果会很有用。

于 2008-10-23T11:49:15.423 回答