如何在执行DataBind之前对DataSet进行排序?

时间:2008-10-23 07:42:28

标签: .net data-binding sorting .net-2.0 dataset

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

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

编辑我无法让这些答案适合我,我想因为我使用 .Net 2.0。

7 个答案:

答案 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";