Как я могу отсортировать DataSet перед выполнением DataBind? - PullRequest
3 голосов
/ 23 октября 2008

У меня есть данные, поступающие из базы данных в виде DataSet. Затем я устанавливаю его как DataSource элемента управления сеткой, прежде чем сделать DataBind(). Я хочу отсортировать DataSet / DataTable по одному столбцу. Этот столбец сложен для сортировки в базе данных, но я надеялся, что смогу отсортировать его, как если бы я сортировал общий список, т. Е. Используя разделитель.

Возможно ли это, или мне нужно перенести его в другую структуру данных?

Редактировать Я не могу заставить ни один из этих ответов работать на меня, думаю, потому что я использую .Net 2.0.

Ответы [ 7 ]

6 голосов
/ 23 октября 2008

Из-за того, как работает сортировка 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, если вы используете типизированный набор данных)

3 голосов
/ 23 октября 2008

Я думаю, что DataView.Sort свойство поможет. Вы можете получить к нему доступ через DataTable.DefaultView .

2 голосов
/ 23 октября 2008

Если вы не возражаете против потери управления / сортировки на элементе управления, вы можете использовать что-то вроде:

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

И эта сортировка будет принимать IComparables и т. Д. В соответствии с перегрузками, так что вы можете сортировать, как вам нравится.

1 голос
/ 14 октября 2010
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();


    }
}
0 голосов
/ 17 апреля 2009

Вы можете сделать это по

myTableName.DefaultView.Sort = "MyFieldName DESC";
0 голосов
/ 23 октября 2008

Почему столбец сложнее сортировать в базе данных ? Предполагается, что сложность сортировки будет одинаковой в базе данных или в структуре, если, конечно, это не вычисляемый столбец, и даже в этом случае я предполагаю, что сортировка в БД все еще быстрее.

Однако, как сказал Джон, вы можете изменить сортировку на уровне формы через свойство DataView.Sort. Я бы рекомендовал делать это, если это занимает слишком много времени, и в этом случае было бы полезно кэшировать результаты.

0 голосов
/ 23 октября 2008

Вы можете отсортировать базу данных в памяти, но я не знаю, что будет "слишком сложно для сортировки в базе данных". На вашем месте я бы попытался отсортировать его в базе данных, использовать представления, индексы избыточности, сложные операторы SQL, вероятно, это будет быстрее, чем сортировка большого набора данных в памяти, с дополнительным преимуществом, заключающимся в том, что он сохраняет сортировку для других тип клиентов (например, веб-сервисы и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...