DataView.Sort - больше, чем просто asc / desc (нужна пользовательская сортировка)

Простое решение mysqli:

$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT * FROM table WHERE 1');
while ( $rows = $resource->fetch_assoc() ) {
    print_r($rows);//echo "{$row['field']}";
}
$resource->free();
$db->close();

С обработкой ошибок: если есть фатальная ошибка, скрипт завершится с сообщением об ошибке.

// ini_set('display_errors',1); // Uncomment to show errors to the end user.
if ( $db->connect_errno ) die("Database Connection Failed: ".$db->connect_error);
$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT field FROM table WHERE 1');
if ( !$resource ) die('Database Error: '.$db->error);
while ( $row = $resource->fetch_assoc() ) {
    echo "{$row['field']}";
}
$resource->free();
$db->close();

Использование итераторов: добавлена ​​поддержка PHP 5.4

$db = new mysqli('localhost','user','password','database');
foreach ( $db->query('SELECT * FROM table') as $row ) {
    print_r($row);//echo "{$row['field']}";
}
$db->close();

Извлечение одной записи: этот код не требует

$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT field FROM table');
$row = $resource->fetch_assoc();
echo "{$row['field']}";
$resource->free();
$db->close();
13
задан bugfixr 24 February 2009 в 16:09
поделиться

4 ответа

Хорошо, я просто сделал это на скорую руку реальное быстрый, и не сделал всей необходимой обработки ошибок и пустой проверки, но она должна дать Вам общее представление и должна быть достаточно для запущения Вас:

public static class DataTableExtensions
{
    public static DataView ApplySort(this DataTable table, Comparison<DataRow> comparison)
    {

        DataTable clone = table.Clone();
        List<DataRow> rows = new List<DataRow>();
        foreach (DataRow row in table.Rows)
        {
            rows.Add(row);    
        }

        rows.Sort(comparison);

        foreach (DataRow row in rows)
        {
            clone.Rows.Add(row.ItemArray);
        }

        return clone.DefaultView;
    }


}

Использование:

    DataTable table = new DataTable();
    table.Columns.Add("IntValue", typeof(int));
    table.Columns.Add("StringValue");

    table.Rows.Add(11, "Eleven");
    table.Rows.Add(14, "Fourteen");
    table.Rows.Add(10, "Ten");
    table.Rows.Add(12, "Twelve");
    table.Rows.Add(13, "Thirteen");

//Вид StringValue:

 DataView sorted = table.ApplySort((r, r2) =>
        {
            return ((string)r["StringValue"]).CompareTo(((string)r2["StringValue"]));
        });

Результат:

11 Одиннадцать

14 Четырнадцать

10 Десять

13 Тринадцать

12 Двенадцать

//Вид IntValue:

DataView sorted = table.ApplySort((r, r2) =>
            {
                return ((int)r["IntValue"]).CompareTo(((int)r2["IntValue"]));
            });

Результат:

10 Десять

11 Одиннадцать

13 Тринадцать

12 Двенадцать

14 Четырнадцать

РЕДАКТИРОВАНИЕ: Измененный это на дополнительный метод.

Теперь в Вашей Лямбде, (или можно создать полноценный Метод сравнения) можно сделать любой вид пользовательской логики сортировки, в которой Вы нуждаетесь. Помните,-1 меньше, чем, 0 равно, и 1 больше, чем.

17
ответ дан BFree 25 February 2009 в 02:09
поделиться
  • 1
    Вы могли добавить headerView и footerView к разделу и добавить тень к тем представлениям. †“tableView:viewForHeaderInSection: †“tableView:viewForFooterInSection: – Ecarrion 24 December 2011 в 22:29

Вы могли использовать если или оператор переключения для получения схожей функциональности к избранному оператору выбора:

            if (Something == "1")
                MyView.Sort = "Field1 ASC";
            else
                MyView.Sort = "Field2 ASC";

ИЛИ

            switch (MyProperty)
            {
                case 1:
                    MyView.Sort = "Field1 ASC";
                    break;
                case 2:
                    MyView.Sort = "Field2 ASC";
                    break;
                default:
                    MyView.Sort = "Field3 ASC";
                    break;
            }
1
ответ дан REA_ANDREW 25 February 2009 в 02:09
поделиться
  • 1
    Это сделало это, просто должен был изменить несколько вещей в синтаксисе, и это работало отлично. Я действительно ценю справку. Огромное спасибо! – Chris D 31 March 2012 в 03:28

Я не думаю так. Вы могли однако изменить Вас SQL для возврата столбца "CustomSort", который является результатом оператора выбора:

select
    (case when f = 'a' then 0 else 1 end) as CustomSort
from MyTable
1
ответ дан user53794 25 February 2009 в 02:09
поделиться
  • 1
    что происходит когда анимация hasn' t выполненный все же, таким образом, wouldn' t, которые возвращают ложный результат, таким образом отменяющий анимацию. I' ll дают ему выстрел, но это - первая мысль, которая прибыла по моему мнению. Спасибо за справку так или иначе. – Chris D 31 March 2012 в 03:06

Мне нравится ответ BFREE, хотя я волновался бы о риске, что мой код закончит тем, что обновил клонированную таблицу, а не реальную. (Я не продумал его достаточно, чтобы знать, является ли это на самом деле проблемой, если Вы только используете дополнительный метод в DataView.)

можно сделать это на оригинале DataTable путем добавления расчетного DataColumn к нему (использование Expression свойство) и затем сортировка на ее значении.

В Вашем случае это было бы что-то как:

DataColumn c = myTable.Columns.Add("Sort", typeof(int));
c.Expression = "iif(field='SomeValue', 0, iif(field='AnotherValue', 1, 2))";

, который виды SomeValue первый, 116-секундный, и все остальное после этого.

16
ответ дан Robert Rossney 25 February 2009 в 02:09
поделиться
  • 1
    Это doesn' t справка, there' s никакая тень вокруг углов или сторон тот путь. I' ve попробовал это слишком... Ответ не так прост, как Вы принимаете - I' ve попробовал каждое очевидное решение, о котором я могу думать. Однако Твиттер делает это должно быть более сложным или использовать своего рода взлом для работы, а также это делает. – Jordan Smith 24 December 2011 в 22:41
Другие вопросы по тегам:

Похожие вопросы: