IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Sorting, filtering, grouping et paging inopérant avec DevExpress


Sujet :

ASP.NET MVC

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut Sorting, filtering, grouping et paging inopérant avec DevExpress
    Bonsoir.
    ça fait 2 jours que je bloque sur la création d'une grille avec DevExpress :/.
    Ma grille s'affiche, mais il m'est impossible d'effectuer des actions de base.

    mon controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    using LivDevis.ClassLibrary;
    using LivDevis.ClassLibrary.Classes;
    using LivDevis.ClassLibrary.Entities;
    using LivDevis.Filters;
    using LivDevis.Models;
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Security;
     
    namespace LivDevis.Controllers
    {
        [AuthorizeAuthentificated]
        public partial class CustomerController : DevExpressController
        {
            public override string ControllerName { get { return "Customer"; } }
     
            public ActionResult IndividualCustomerList()
            {
                return DevExpressView("IndividualCustomerList");
            }
        }
    }
    la seconde partie de mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    using DevExpress.Data;
    using DevExpress.Web.Mvc;
    using LivDevis.Helpers;
    using LivDevis.Models;
    using LivDevis.Models.DevExpress;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
     
    namespace LivDevis.Controllers
    {
        public partial class CustomerController : DevExpressController
        {
            public ActionResult IndividualCustomerList_Partial()
            {
                DevExpress.Web.Mvc.GridViewModel gridView = GridViewExtension.GetViewModel("GridViewIndividualCustomerList");
                if (gridView == null)
                {
                    gridView = CreateGridViewModel();
                }
                return IndividualCustomerList_Core(gridView);
            }
     
            /****************************************************************************************************
             * Editing
             ***************************************************************************************************/
            public ActionResult EditingDelete(Guid CustomerID)
            {
                DevExpressIndividualCustomerModel.Delete(CustomerID);
                return RedirectToAction("IndividualCustomerList");
            }
     
            /****************************************************************************************************
             * Events
             ***************************************************************************************************/
            // Paging
            public ActionResult IndividualCustomerList_Paging(GridViewPagerState pager)
            {
                DevExpress.Web.Mvc.GridViewModel gridView = GridViewExtension.GetViewModel("GridViewIndividualCustomerList");
                gridView.Pager.Assign(pager);
                return IndividualCustomerList_Core(gridView);
            }
     
            // Filtering
            public ActionResult IndividualCustomerList_Filtering(GridViewColumnState column)
            {
                DevExpress.Web.Mvc.GridViewModel gridView = GridViewExtension.GetViewModel("GridViewIndividualCustomerList");
                gridView.Columns[column.FieldName].Assign(column);
                return IndividualCustomerList_Core(gridView);
            }
     
            // Sorting
            public ActionResult IndividualCustomerList_Sorting(GridViewColumnState column, bool reset)
            {
                DevExpress.Web.Mvc.GridViewModel gridView = GridViewExtension.GetViewModel("GridViewIndividualCustomerList");
                gridView.SortBy(column, reset);
                return IndividualCustomerList_Core(gridView);
            }
     
            // Grouping
            public ActionResult IndividualCustomerList_Grouping(GridViewColumnState column)
            {
                DevExpress.Web.Mvc.GridViewModel gridView = GridViewExtension.GetViewModel("GridViewIndividualCustomerList");
                gridView.Columns[column.FieldName].Assign(column);
                return IndividualCustomerList_Core(gridView);
            }
     
            PartialViewResult IndividualCustomerList_Core(DevExpress.Web.Mvc.GridViewModel gridView)
            {
                DevExpressIndividualCustomerModel.SetModel();
     
                gridView.ProcessCustomBinding(
                    DevExpressIndividualCustomerModel.GetDataRowCount,
                    DevExpressIndividualCustomerModel.GetData,
                    DevExpressIndividualCustomerModel.GetSummaryValues,
                    DevExpressIndividualCustomerModel.GetGroupingInfo,
                    DevExpressIndividualCustomerModel.GetUniqueHeaderFilterValues
                );
                return PartialView("DevExpress.Customer.IndividualCustomerList_Partial", gridView);
            }
     
            static DevExpress.Web.Mvc.GridViewModel CreateGridViewModel()
            {
                DevExpress.Web.Mvc.GridViewModel gridView = new DevExpress.Web.Mvc.GridViewModel();
                gridView.KeyFieldName = "Customer_CustomerID";
                gridView.Columns.Add("IndividualCustomer_FirstName");
                gridView.Columns.Add("IndividualCustomer_LastName");
                gridView.Pager.PageSize = 50;
                gridView.TotalSummary.Add(new GridViewSummaryItemState() { FieldName = "IndividualCustomer_FirstName", SummaryType = SummaryItemType.Count });
                return gridView;
            }
        }
    }
    Ma classe personnalisée GridViewModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    using DevExpress.Data;
    using DevExpress.Data.Filtering;
    using DevExpress.Data.Linq;
    using DevExpress.Data.Linq.Helpers;
    using DevExpress.Web.Mvc;
     
    using LivDevis.Helpers;
     
    using LivDevis.ClassLibrary.Entities;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Web;
     
    namespace LivDevis.Models.DevExpress
    {
        public class GridViewModel
        {
            public static IQueryable Model { get; set; }
     
            public static void GetDataRowCount(GridViewCustomBindingGetDataRowCountArgs e)
            {
                e.DataRowCount = Model.ApplyFilter(e.FilterExpression)
                                        .Count();
            }
     
            public static void GetData(GridViewCustomBindingGetDataArgs e)
            {
                IQueryable keys = Model.ApplyFilter(e.State.FilterExpression)
                                        .ApplyFilter(e.GroupInfoList)
                                        .ApplySorting(e.State.SortedColumns)
                                        .Skip(e.StartDataRowIndex)
                                        .Take(e.DataRowCount)
                                        .Select(e.State.KeyFieldName);
     
                if (keys.Count() != 0)
                {
                    e.Data = Model.ApplyFilter(new InOperator(e.State.KeyFieldName, keys).ToString());
                }
            }
     
            public static void GetSummaryValues(GridViewCustomBindingGetSummaryValuesArgs e)
            {
                IQueryable query = Model.ApplyFilter(e.State.FilterExpression)
                                        .ApplyFilter(e.GroupInfoList);
     
                ArrayList list = new ArrayList();
                foreach (GridViewSummaryItemState item in e.SummaryItems)
                {
                    switch (item.SummaryType)
                    {
                        case SummaryItemType.Count:
                            list.Add(query.Count());
                        break;
     
                        case SummaryItemType.Sum:
                            list.Add(query.Sum(item.FieldName));
                        break;
                    }
                }
     
                e.Data = list;
            }
     
            public static void GetGroupingInfo(GridViewCustomBindingGetGroupingInfoArgs e)
            {
                e.Data = Model.ApplyFilter(e.State.FilterExpression)
                                .ApplyFilter(e.GroupInfoList)
                                .GetGroupInfo(e.FieldName, e.SortOrder);
            }
     
            public static void GetUniqueHeaderFilterValues(GridViewCustomBindingGetUniqueHeaderFilterValuesArgs e)
            {
                e.Data = Model.ApplyFilter(e.FilterExpression)
                                .UniqueValuesForField(e.FieldName);
            }
        }
    }
    ma classe Customer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    using DevExpress.Data;
    using DevExpress.Data.Filtering;
    using DevExpress.Data.Linq;
    using DevExpress.Data.Linq.Helpers;
    using DevExpress.Web.Mvc;
     
    using LivDevis.Helpers;
     
    using LivDevis.ClassLibrary.Entities;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Web;
     
    namespace LivDevis.Models.DevExpress
    {
        public class DevExpressIndividualCustomerModel : LivDevis.Models.DevExpress.GridViewModel
        {
            public static void SetModel()
            {
                List<IndividualCustomerModel> _Customers = new List<IndividualCustomerModel>();
     
                foreach (IndividualCustomer CustomerDB in IndividualCustomer.GetList())
                {
                    IndividualCustomerModel _Customer = new IndividualCustomerModel();
                    _Customer.GetRecord(CustomerDB);
                    _Customers.Add(_Customer);
                }
     
                Model = _Customers.AsQueryable<IndividualCustomerModel>();
            }
     
            public static void Delete(Guid CustomerID)
            {
                IndividualCustomer CustomerDB = IndividualCustomer.Get(CustomerID);
                if (CustomerDB != null)
                {
                    IndividualCustomer.Delete(CustomerDB);
                }
            }
        }
    }
    ma vue partielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    @using LivDevis.Helpers
     
    @Html.DevExpress().GridView(
        settings => {
            settings.Name = "GridViewIndividualCustomerList";
            settings.CallbackRouteValues = new { Controller = "Customer", Action = "IndividualCustomerList_Partial" };
            settings.Width = Unit.Pixel(840);
     
            /****************************************************************************************************
             * Paging, Filtering, Sorting, Grouping
             ***************************************************************************************************/
            settings.CustomBindingRouteValuesCollection.Add(
                GridViewOperationType.Paging,
                new { Controller = "Customer", Action = "IndividualCustomerList_Paging" }
            );
     
            settings.CustomBindingRouteValuesCollection.Add(
                GridViewOperationType.Filtering,
                new { Controller = "Customer", Action = "IndividualCustomerList_Filtering" }
            );
     
            settings.CustomBindingRouteValuesCollection.Add(
                GridViewOperationType.Sorting,
                new { Controller = "Customer", Action = "IndividualCustomerList_Sorting" }
            );
     
            settings.CustomBindingRouteValuesCollection.Add(
                GridViewOperationType.Grouping,
                new { Controller = "Customer", Action = "IndividualCustomerList_Grouping" }
            );
     
            /* Properties */
            settings.KeyFieldName = "Customer_CustomerID";
     
            settings.Settings.ShowFilterRow = true;
            settings.Settings.ShowGroupPanel = true;
            settings.Settings.ShowFooter = true;
            settings.SettingsBehavior.AllowFocusedRow = true;
     
            settings.Settings.HorizontalScrollBarMode = ScrollBarMode.Hidden;
            settings.Settings.VerticalScrollBarMode = ScrollBarMode.Visible;
            settings.Settings.VerticalScrollableHeight = 400;
            settings.SettingsPager.PageSize = 50;
            settings.SettingsPager.Position = PagerPosition.TopAndBottom;
            settings.SettingsPager.FirstPageButton.Visible = true;
            settings.SettingsPager.LastPageButton.Visible = true;
            settings.SettingsPager.PageSizeItemSettings.Visible = true;
            settings.SettingsPager.PageSizeItemSettings.ShowPopupShadow = true;
            settings.SettingsPager.PageSizeItemSettings.Items = new string[] { "50", "100", "200" };
     
            /****************************************************************************************************
             * Columns
             ***************************************************************************************************/
            settings.Columns.Add(column =>
            {
                column.SetDataItemTemplateContent(c =>
                {
                    ViewContext.Writer.Write(
                        Html.ActionLink(LivDevis.Resources.Views.DevExpress.GridView.DisplayDeleting, "EditingDelete", new { CustomerID = DataBinder.Eval(c.DataItem, "Customer_CustomerID") },
                            new { onclick = "return confirm('Do you really want to delete this record?')" })
                    );
                });
                column.Settings.AllowDragDrop = DefaultBoolean.False;
                column.Settings.AllowSort = DefaultBoolean.False;
                column.Width = Unit.Pixel(100);
            });
     
            settings.Columns.Add(column => {
                column.FieldName = "IndividualCustomer_FirstName";
                column.Caption = LivDevis.Resources.Models.CustomerModel.DisplayFirstName;
                column.ColumnType = MVCxGridViewColumnType.TextBox;
                column.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
            });
     
            settings.Columns.Add(column => {
                column.FieldName = "IndividualCustomer_LastName";
                column.Caption = LivDevis.Resources.Models.CustomerModel.DisplayLastName;
                column.ColumnType = MVCxGridViewColumnType.TextBox;
                column.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
            });
     
            settings.TotalSummary.Add(DevExpress.Data.SummaryItemType.Count, "IndividualCustomer_FirstName");
     
            /****************************************************************************************************
             * Events
             ***************************************************************************************************/
            settings.ClientSideEvents.Init = "function(s, e) { s.PerformCallback(); }";
        }).BindToCustomData(Model).GetHtml()
    bon alors ... il se passe quoi ?
    ma grille s'affiche avec des informations, jusque là c'est niquel. Mais après les choses se corcent !
    lorsque je saisie des données dans les champs texte pour une recherche dans ma grille, voilà le contenu que j'obtiens dans mon objet "GridViewColumnState column" dans "IndividualCustomerList_Filtering" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FieldName = ""
    FIlterExpression = null
    GroupIndex = -1
    SortIndex = -1
    SortOrder = None
    Du coup, rien le marche :/

    Lorsque j'utilise la pagination avec a liste déroulante pour choisir le nombre réponses par page, la valeur que j'obtiens dans mon objet "GridViewPagerState pager" reste toujours 10 (valeur par défaut semble t'il).

    Je ne vois pas où est mon erreur. Je commence à craindre une incompatibilité entre la dernière version de DevExpress et les versions récentes de jQuery !!
    Svp, dites-moi que ce n'est pas ça, car ce ne serait pas bon pour moi ^^.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Bonjour.

    Je n'ai toujours pas réussi à faire fonctionner ma grille. Auriez-vous une idée pour moi svp ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thor76160 Voir le message
    Je n'ai toujours pas réussi à faire fonctionner ma grille. Auriez-vous une idée pour moi svp ?
    Les contrôles DevExpress sont vraiment géniaux même quand on veut faire des trucs personnalisés ou un peu délicats ça devient une plaie de les configurer. Je te conseille surtout d'aller sur leur forum et d'y effectuer une recherche (d'habitude en faisant ça j'arrive à trouver réponse à mon problème) ou d'y poser ta question (ils sont réactifs parfois)

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2010, 13h15
  2. Un GridView avec une sorte de GRoup By
    Par zooffy dans le forum ASP.NET
    Réponses: 0
    Dernier message: 17/12/2009, 09h45
  3. emuler des pages asp avec connexion a access
    Par laville dans le forum ASP
    Réponses: 2
    Dernier message: 01/06/2005, 18h44
  4. [C#] Comment récuper un page xml avec une URL
    Par pc152 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/02/2005, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo