Перетаскивание HTML поддающиеся сортировке таблицы

Этот ответ является ответом на комментарий выше и не работает с VisualStudio 2008, но должен быть предпочтительнее с более поздними компиляторами.


Между тем вам больше не нужно использовать указатель void и нет необходимости в усилении, так как доступны std::bind и std::function . Преимущество одного (по сравнению с указателями void) - это безопасность типа, поскольку тип возврата и аргументы явно указаны с помощью std::function:

// std::function
void Init(std::function f);

Затем вы можете создать функцию указатель с std::bind и передать его Init:

auto cLoggersInfraInstance = CLoggersInfra();
auto callback = std::bind(&CLoggersInfra::RedundencyManagerCallBack, cLoggersInfraInstance);
Init(callback);

Полный пример для использования std::bind с членами, статическими членами и не-членными функциями:

#include 
#include 
#include 

class RedundencyManager // incl. Typo ;-)
{
public:
    // std::function
    std::string Init(std::function f) 
    {
        return f();
    }
};

class CLoggersInfra
{
private:
    std::string member = "Hello from non static member callback!";

public:
    static std::string RedundencyManagerCallBack()
    {
        return "Hello from static member callback!";
    }

    std::string NonStaticRedundencyManagerCallBack()
    {
        return member;
    }
};

std::string NonMemberCallBack()
{
    return "Hello from non member function!";
}

int main()
{
    auto instance = RedundencyManager();

    auto callback1 = std::bind(&NonMemberCallBack);
    std::cout << instance.Init(callback1) << "\n";

    // Similar to non member function.
    auto callback2 = std::bind(&CLoggersInfra::RedundencyManagerCallBack);
    std::cout << instance.Init(callback2) << "\n";

    // Class instance is passed to std::bind as second argument.
    // (heed that I call the constructor of CLoggersInfra)
    auto callback3 = std::bind(&CLoggersInfra::NonStaticRedundencyManagerCallBack,
                               CLoggersInfra()); 
    std::cout << instance.Init(callback3) << "\n";
}

Возможный выход:

Hello from non member function!
Hello from static member callback!
Hello from non static member callback!

Кроме того, используя std::placeholders , вы можете динамически передавать аргументы для обратного вызова (например, это позволяет использовать return f("MyString"); в Init, если f имеет строковый параметр).

11
задан Brian Tompsett - 汤莱恩 12 September 2016 в 20:48
поделиться

7 ответов

Я использовал dhtmlxGrid в прошлом. Среди прочего это поддерживает строки/столбцы перетаскивания, клиентская сортировка (строка, целое число, дата, пользовательская) и мультиподдержка браузера.

Ответ на комментарий: Нет, не найденный чем-либо лучше - просто шел дальше из того проекта.:-)

4
ответ дан 3 December 2019 в 02:21
поделиться

Я использовал jQuery поддающийся сортировке плагин UI с хорошими результатами. Разметка, подобная этому:

<table id="myTable">
<thead>
<tr><th>ID</th><th>Name</th><th>Details</th></tr>
</thead>
<tbody class="sort">
<tr id="1"><td>1</td><td>Name1</td><td>Details1</td></tr>
<tr id="2"><td>2</td><td>Name1</td><td>Details2</td></tr>
<tr id="3"><td>3</td><td>Name1</td><td>Details3</td></tr>
<tr id="4"><td>4</td><td>Name1</td><td>Details4</td></tr>
</tbody>
</table>

и затем в JavaScript

$('.sort').sortable({
    cursor: 'move',
    axis:   'y',
    update: function(e, ui) {
        href = '/myReorderFunctionURL/';
        $(this).sortable("refresh");
        sorted = $(this).sortable("serialize", 'id');
        $.ajax({
            type:   'POST',
            url:    href,
            data:   sorted,
            success: function(msg) {
                //do something with the sorted data
            }
        });
    }
});

Это ОТПРАВЛЯЕТ сериализированную версию идентификаторов объектов к данному URL. Эта функция (PHP в моем случае) затем обновляет заказы объектов в базе данных.

20
ответ дан 3 December 2019 в 02:21
поделиться

Я рекомендую Sortables в jQuery. Можно использовать его на элементах списка или в значительной степени чем-либо, включая таблицы.

jQuery является очень дружественным перекрестным браузером, и я рекомендую всему этому время.

5
ответ дан 3 December 2019 в 02:21
поделиться

Ответ David Heggie был самым полезным для меня. Это может быть немного более кратко:

var sort = function(event, ui) {
  var url = "/myReorderFunctionURL/" + $(this).sortable('serialize');
  $.post(url, null,null,"script");  // sortable("refresh") is automatic
}

$(".sort").sortable({
  cursor: 'move',
  axis: 'y',
  stop: sort
});

работы для меня, с той же разметкой.

3
ответ дан 3 December 2019 в 02:21
поделиться

Большинство платформ (Yui, MooTools, jQuery, Prototype/Scriptaculous, и т.д.) имеет поддающуюся сортировке функциональность списка. Проведите немного исследования в каждого и выберите того, который удовлетворяет Вашим потребностям больше всего.

1
ответ дан 3 December 2019 в 02:21
поделиться

Как насчет поддающегося сортировке? Это, казалось бы, соответствовало бы Вашим требованиям приятно.

Это довольно просто в использовании - загружают поддающийся сортировке файл JavaScript, затем, для каждой таблицы, которую Вы хотите, чтобы это сделало поддающимся сортировке, применило класс = "поддающийся сортировке" к <таблица> тег.

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

0
ответ дан 3 December 2019 в 02:21
поделиться

Если Вы не возражаете против Java, существует очень удобная библиотека для GWT под названием выезд GWT-DND демонстрация онлайн, чтобы видеть, насколько мощный это.

0
ответ дан 3 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

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