Как получить значения столбца с помощью columnchooser в JQGrid?

Добрый день!

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

Я использовал «columnChooser», чтобы мой пользователь мог выбирать свои столбцы по умолчанию.

Теперь моя проблема: как получить те столбцы, которые выбрал пользователь?
И как установить эти столбцы в качестве столбцов по умолчанию?

Может ли кто-нибудь помочь мне с этой проблемой.

Спасибо

Джейсон


person RJ.    schedule 19.07.2011    source источник


Ответы (1)


После того, как пользователь изменит макет столбца, вы можете получить colModel из сетки, выполнить итерацию по ней и поместить конфигурацию в массив объектов json, которые затем будут отправлены на сервер. Следующий код делает это:

function saveColumnConfiguration(grid, url) {
    if (url.length > 0) {
        var colArray = new Array();
        var colModel = grid[0].p.colModel;
        for (var i = 0; i < colModel.length; i++) {
            if (colModel[i].name != "rn" && colModel[i].name != "cb") {
                colArray.push({
                    Name: colModel[i].name,
                    Width: colModel[i].width,
                    Visible: !colModel[i].hidden
                });
            }
        }
        $.ajax({
            url: url,
            type: 'POST',
            data: 'columnConfiguration=' + JSON.stringify(colArray)
        });
    }
}

Проверка на «rn» и «cb» означает, что столбцы rownumber и checkbox не берутся.

ОБНОВЛЕНИЕ

Вам понадобится класс для представления столбцов:

[Serializable]
public class JqGridColumn
{
    public string Name { get; set; }
    public int Width { get; set; }
    public bool Visible { get; set; }
}

Вам также понадобится настраиваемое связывание модели для десериализации входящего списка:

public class JqGridConfigurationModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var conf = bindingContext.ValueProvider.GetValue("columnConfiguration").AttemptedValue;

        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var configuration = serializer.Deserialize<IEnumerable<JqGridColumn>>(conf);

        return configuration;
    }
}

Зарегистрируйте связыватель модели при запуске приложения:

ModelBinders.Binders.Add(typeof(IEnumerable<JqGridColumn>), new JqGridConfigurationModelBinder());

Действие в контроллере, обрабатывающем список, будет примерно таким:

public void SaveColumnConfiguration(IEnumerable<JqGridColumn> columnConfiguration)
{
    // Save the list accordingly...
}

Обратите внимание, что порядок столбцов представлен их положением в списке. Затем вы можете легко прочитать эту конфигурацию и визуализировать сетку.

ОБНОВЛЕНИЕ 2

Функция в вашем случае должна называться так

saveColumnConfiguration($("#freight_bill"), "/Controller/Action");

Но нет после вызова columnChooser. Вы можете либо сделать другую кнопку для сохранения изменений, когда пользователь решит это сделать, либо обработать событие done из средства выбора столбца следующим образом:

$("#freight_bill").jqGrid('columnChooser', {
    done: function (perm) {
            if (perm) { 
                $("#freight_bill").jqGrid("remapColumns", perm, true, false); 
            }
            saveColumnConfiguration($("#freight_bill"), "/Controller/Action");
        }
});
person shizik    schedule 19.07.2011
comment
Привет, Шизик. Я попробовал ваш код, и он не работает :(. Есть ли другие способы сделать это? - person RJ.; 20.07.2011
comment
Я вижу, что вопрос помечен в asp.net mvc. Если это так, вам нужно создать специальную привязку модели, которая преобразует входящий список. Я обновлю ответ соответственно. - person shizik; 20.07.2011
comment
Привет, Шизик, у меня возникла ошибка, когда я добавил ModelBinders.Binders.Add(typeof(IEnumerable‹JqGridColumn›), new JqGridConfigurationModelBinder()); в моем глобальном файле в Application_Start(). - person RJ.; 28.07.2011
comment
В нем говорится: «Аргумент 2»: невозможно преобразовать из «APR_Plus.JqGridConfigurationModelBinder» в «System.Web.Mvc.IModelBinder», а лучший перегруженный метод соответствует «System.Web.Mvc.ModelBinderDictionary.Add(System.Type, System. Web.Mvc.IModelBinder) имеет недопустимые аргументы. - person RJ.; 28.07.2011
comment
Я уже исправил ошибку... :) Теперь я продолжу работу. большое спасибо - person RJ.; 28.07.2011
comment
Привет, Шизик, я добавил все коды в свой проект. Мой вопрос в том, что функция выше saveColumnConfiguration(grid, url) будет включена в мой файл представления, верно? Итак, теперь при вызове этой функции какими будут значения для сетки и URL-адреса? Извините, но все еще наивно, когда дело доходит до JQGrid... И здесь будет вызываться функция saveColumnConfiguration(grid, url)? onClickButton: function() { $(#freight_bill).jqGrid('columnChooser'); saveColumnConfiguration(?,?); } Большое спасибо.... РЖ - person RJ.; 28.07.2011
comment
Полезный, подробный ответ! Спасибо! - person Steve; 15.09.2011