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 Discussion :

Probleme de calcul Devexpress [Débutant]


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut Probleme de calcul Devexpress
    bonjour a tous,

    Je suis nouveau dans la programmation en asp avec devexpress et j'aurais aimé savoir comment faire pour calculer la somme d'une colonne selon la valeur d'une autre case (si la valeur est a 1 je la prend en compte sinon non) tout cela sur une ASPxGridView .

    a Default de pouvoir le faire de cette façon il faudrait que je puisse récupéré le filtre appliqué dans la colonne afin de faire ce calcul via une requette sql mais encore une fois je n'ai pas la moindre idée de l'action appelée lorsque l'on applique un filtre

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Par défaut
    Bonjour,

    Quelle forme a ton DataSource ? Je suppose que c'est une Datatable ?

    Si oui, combien de colonne as tu ? La variable qui est à 1 ou non se trouve où dans cette source ? A chaque ligne ?


    Sinon pour récupérer le filtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String MonFiltre = MonGridView.FilterExpression;
    Tu as également tout plein de façon de récupérer des valeurs côté JavaScript avec les ClientSideEvents du GridView.

    Par Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonGridView.ClientSideEvents.ColumnSorting = "MaFonctionJS";
    Et là dans la fonction JS, tu peux récupérer quasiment ce que tu veux avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonComposant.GetText();
    Pour mettre ça dans un champ caché accessible côté serveur.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Citation Envoyé par Zeckard Voir le message
    Bonjour,

    Quelle forme a ton DataSource ? Je suppose que c'est une Datatable ?

    Si oui, combien de colonne as tu ? La variable qui est à 1 ou non se trouve où dans cette source ? A chaque ligne ?
    Bonjour Zeckard et merci de ta réponse !

    il s'agit d'un SqlDataSource qui contient en effet la variable a 0 ou a 1 pour chaque ligne.

    je suppose qu'il est possible de faire ce calcul via le customSummary mais je ne vois pas comment faire pour calculer seulement les les lignes qui ont cette variable de setter .

  4. #4
    Membre éprouvé Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Par défaut
    Tu veux afficher le résultat d'une colonne ou d'une ligne ?

    Si c'est d'une ligne, je t'ai préparé un petit exemple avec DevExpress :

    Donc j'ai préparé un petit DataTable pour tester :

    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
        public static DataTable getNumber()
        {
            DataTable TabNumber = new DataTable();
            TabNumber.Columns.Add("Chiffre1", typeof(Int32));
            TabNumber.Columns.Add("Chiffre2", typeof(Int32));
            TabNumber.Columns.Add("Resultats", typeof(Int32));
            DataRow r_Yes = TabNumber.NewRow();
            r_Yes["Chiffre1"] = 8;
            r_Yes["Chiffre2"] = 5;
            r_Yes["Resultats"] = 0;
            TabNumber.Rows.Add(r_Yes);
            DataRow r_No = TabNumber.NewRow();
            r_No["Chiffre1"] = 7;
            r_No["Chiffre2"] = 2;
            r_No["Resultats"] = 1;
            TabNumber.Rows.Add(r_No);
            DataRow r_N = TabNumber.NewRow();
            r_N["Chiffre1"] = 1;
            r_N["Chiffre2"] = 4;
            r_N["Resultats"] = 0;
            TabNumber.Rows.Add(r_N);
     
            return TabNumber;
        }
    La colonne "Resultats" contient 0 ou 1 comme ton champ. Je ne savais pas comment l’appeler, pour ça je te fais confiance.

    Ensuite, je crée mon GridView et ressort 2 événements, son Initialisation et l'ajout d'une colonne de calcul qui n'est pas dans le Datatable en source.

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            ASPxGridView LeGridView = new ASPxGridView();
            LeGridView.DataSource = getNumber();
            LeGridView.Init += new EventHandler(LeGridView_Init);
            LeGridView.DataBind();
     
            LeGridView.CustomUnboundColumnData +=new ASPxGridViewColumnDataEventHandler(LeGridView_CustomUnboundColumnData);
    Evénements Init, où je rajoute la colonne de total :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        void LeGridView_Init(object sender, EventArgs e)
        {
            GridViewDataTextColumn ColonneResultats = new GridViewDataTextColumn();
            ColonneResultats.Caption = "Total";
            ColonneResultats.FieldName = "Total";
            ColonneResultats.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
            ColonneResultats.VisibleIndex = (sender as ASPxGridView).VisibleColumns.Count;
            (sender as ASPxGridView).Columns.Add(ColonneResultats);
            (sender as ASPxGridView).DataBind();
        }
    Et l’événement CustomUnboundColumnData où je fais le calcul quand le champ Résultats est égal à 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        void LeGridView_CustomUnboundColumnData(object sender, ASPxGridViewColumnDataEventArgs e)
        {
            if ((e.Column.FieldName == "Total"))
            {
                if (Convert.ToInt32(e.GetListSourceFieldValue("Resultats")) == 1)
                {
                    decimal chiffre1 = Convert.ToDecimal(e.GetListSourceFieldValue("Chiffre1"));
                    decimal chiffre2 = Convert.ToDecimal(e.GetListSourceFieldValue("Chiffre2"));
                    e.Value = chiffre1 + chiffre2;
                }
            }
        }
    Ce qui me donne :



    J’espère t'avoir aidé.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Merci beaucoup de ton aide précieuse !

    cependant je cherche a afficher le résultat de la colonne chiffre 1 dans ton exemple et non pas par ligne.

    Dois-je quand meme utiliser l'évènement CustomUnboundColomnData ?
    cela ne semble pas fonctionner chez moi

  6. #6
    Membre éprouvé Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Par défaut
    Pour l'avoir en colonne en fonction de ton "flag" (1 ou 0), il faut passer par un Custom Summary. Il faut donc dans un premier temps que tu poses tes colonnes une à une en les associant avec le field name de ton DataSource puis tu fais comme cela :

    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
     
    ASPxGridView LeGridView = new ASPxGridView();
            LeGridView.DataSource = getNumber();
            LeGridView.ClientInstanceName = "LeGridView";
            LeGridView.AutoGenerateColumns = false;
            LeGridView.DataBind();
            LeGridView.Settings.ShowFooter = true;
     
            LeGridView.CustomSummaryCalculate += new DevExpress.Data.CustomSummaryEventHandler(LeGridView_CustomSummaryCalculate);
     
            GridViewDataColumn ColonneChiffre1 = new GridViewDataColumn() { FieldName = "Chiffre1", VisibleIndex = 1 };
            GridViewDataColumn ColonneChiffre2 = new GridViewDataColumn() { FieldName = "Chiffre2", VisibleIndex = 2 };
            GridViewDataColumn ColonneResultats = new GridViewDataColumn() { FieldName = "Resultats", VisibleIndex = 3 };
     
            ASPxSummaryItem Summary = new ASPxSummaryItem();
            Summary.FieldName = "Chiffre1";
            Summary.ShowInColumn = "Chiffre1";
            Summary.SummaryType = DevExpress.Data.SummaryItemType.Custom;
            Summary.Tag = "1";
     
            LeGridView.TotalSummary.Add(Summary);
     
            LeGridView.Columns.Add(ColonneChiffre1);
            LeGridView.Columns.Add(ColonneChiffre2);
            LeGridView.Columns.Add(ColonneResultats);
            LeGridView.DataBind();
    Comme tu le vois, il faut te servir de l'évenement CustomSummaryCalculate. Tu as l'exemple DevExpress ici, mais pour l'exemple je l'ai adapté à ton problème et mon Datatable :

    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
        void LeGridView_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            // Get the summary ID. 
            int summaryID = Convert.ToInt32((e.Item as ASPxSummaryItem).Tag);
            ASPxGridView View = sender as ASPxGridView;
     
            // Initialization 
            if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Start)
            {
                customSum = 0;
            }
            // Calculation 
            if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Calculate)
            {
                short isOnSum = Convert.ToInt16(View.GetRowValues(e.RowHandle, "Resultats"));
                switch (summaryID)
                {
                    case 1: // The total summary calculated against the 'UnitPrice' column. 
                        if (isOnSum == 1) customSum += Convert.ToDecimal(e.FieldValue);
                        break;
                }
            }
            // Finalization 
            if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Finalize)
            {
                switch (summaryID)
                {
                    case 1:
                        e.TotalValue = customSum;
                        break;
                }
            }
        }
    L’événement va parcourir 3 fois chaque ligne, et donc à chaque fois il faut intercepter ce passage avec "e.SummaryProcess" et faire les traitements nécessaire.

    N'oublie pas de mettre le customSum en propriété ou en tout cas en dehors de l’événement car elle sera réinitialisée à chaque fois sinon.

    Donc en définitive, ça me donne ça :


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH 8] Problemes de calcul précis avec FLASH
    Par ZecMan dans le forum Flash
    Réponses: 1
    Dernier message: 20/02/2006, 14h03
  2. Probleme de calcul :S
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 20h06
  3. probleme de calculs : 1-0.9 = 0.099999999999998
    Par francon81 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/06/2005, 14h17
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 16h52
  5. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 17h46

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