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 :

Conversion d'une chaine en date lors de la mise à jour d'un enregistrement d'un GridView


Sujet :

ASP.NET

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut Conversion d'une chaine en date lors de la mise à jour d'un enregistrement d'un GridView
    Salut,

    J'ai une gridview dont les méthodes Select, Insert, Update et Delete sont "mappées" sur un objet métier.

    Parmis les propriétés de l'objet, j'ai des dates. Or, au moment de l'insertion, le code plante à cause d'un pb de conversion des date. La valeur envoyée est une chaine et l'erreur se produit exactement au moment de l'affectation de la valeur à la propriété.

    Où devrais-je placer cette conversion pour que le script marche?

    Voici la pile:
    [InvalidOperationException: Impossible de convertir la valeur du paramètre 'EndDate' de 'System.String' à 'System.DateTime']
    System.Web.UI.WebControls.ObjectDataSourceView.ConvertType(Object value, Type type, String paramName) +378
    System.Web.UI.WebControls.ObjectDataSourceView.BuildObjectValue(Object value, Type destinationType, String paramName) +167
    System.Web.UI.WebControls.ObjectDataSourceView.BuildDataObject(Type dataObjectType, IDictionary inputParameters) +214
    System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +462
    System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +92
    System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +907
    System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +704
    System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +95
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
    System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +123
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
    System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +118
    System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +135
    System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    Merci d'avance.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    a priori dans les évènements Selecting, Updating, Inserting et Deleting du ObjectDataSource, tu dois pouvoir jouer sur les valeurs des paramètres avant que l'opération soit effectuée

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    La fonction "UPDATE" de la classe de la BLL attend un objet de transfert de données. L'erreur se produit au moment du "set" de la date (jj/mm/aaaa h:mn:s) car la datasource ne semble pas typer les données. Ces dernière sont typée System.String.

    L'erreur ne se produit plus quand je formate la date en enlevant l'heure ({0:MM/dd/yyyy}). Cependant, j'aimerais savoir à quel moment je peux intervenir pour spécifier la culture par exemple. Parce que là elle est forcée en-US alors que je voudrais qu'elle tienne compte de la culture du navigateur.

    [EDIT] je viens de faire un test en mettant au format français dd/MM et j'ai une erreur de conversion[/EDIT]


    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il suffirait pas de mettre culture="auto" dans le web.config ou la directive @Page ? Ca utiliserait automatiquement la langue du navigateur...

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    C'est pas le comportement par défaut?

    Le pb, c'est que dans les conversion de dates il faut être explicite sur le format. Sinon, on a des surprises. Comme maintenant.

    Merci de ton aide


    Interessant: https://connect.microsoft.com/Visual...dbackID=105015
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    C'est pas le comportement par défaut?
    Je ne crois pas...

    EDIT:
    Ca fait plaisir de voir à quel point MS se donne du mal pour résoudre les bugs signalés

  7. #7
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Y a-t-il une propriété pour spécifier la culture et non forcer le format?


    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben je viens de faire un test bidon, ça a marché sans problème (testé avec des propriétés double et DateTime pour vérifier le problème de la culture) :

    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
        public class Person
        {
            public string Name { get; set; }
            public string FirstName { get; set; }
            public DateTime DateOfBirth { get; set; }
            public double Salary { get; set; }
     
            public static Person Select()
            {
                return new Person();
            }
     
            public void Update(string name, string firstName, DateTime dateOfBirth, double salary)
            {
                this.Name = name;
                this.FirstName = firstName;
                this.DateOfBirth = dateOfBirth;
                this.Salary = salary;
            }
        }
    Code ASP.NET : 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
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspxCS._Default" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
                SelectMethod="Select" UpdateMethod="Update" TypeName="AspxCS.Person">
                <UpdateParameters>
                    <asp:Parameter Name="name" Type="String" />
                    <asp:Parameter Name="firstName" Type="String" />
                    <asp:Parameter Name="dateOfBirth" Type="DateTime" />
                    <asp:Parameter Name="salary" Type="Double" />
                </UpdateParameters>
            </asp:ObjectDataSource>
            <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" 
                AutoGenerateRows="False" DataSourceID="ObjectDataSource1">
                <Fields>
                    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                    <asp:BoundField DataField="FirstName" HeaderText="FirstName" 
                        SortExpression="FirstName" />
                    <asp:BoundField DataField="DateOfBirth" HeaderText="DateOfBirth" 
                        SortExpression="DateOfBirth" />
                    <asp:BoundField DataField="Salary" HeaderText="Salary" 
                        SortExpression="Salary" />
                    <asp:CommandField ShowEditButton="True" />
                </Fields>
            </asp:DetailsView>
        </div>
        </form>
    </body>
    </html>

    J'ai mis un breakpoint dans la méthode Update, les paramètres reçus sont corrects...

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Ok, mais tu passes des paramètres dont les types sont explicites.
    Je passe un paramètre qui est un objet métier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <SelectParameters>
            <asp:Parameter Name="obj" Type="Object" />
        </SelectParameters>
    Cet objet à des propriétés qui sont des dates. Faudrait-il que je fasse une conversion dans l'accesseur? Mais comment propager la culture de façon explicite? Dans l'image plus haut VS dit qu'il faut peut-être faire une conversion (le petit commentaire).

    Je viens de faire le test de mettre la UICulture et Culture en auto, le format de la date DataFormatString="{0:s}". Ca marche. Il reconnait ce format invariant. Par contre si je mets DataFormatString="{0:d}", ça plante.
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    euh... là je sèche

  11. #11
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    ARGH!...

    La question c'est juste de savoir où je peux intervenir pour faire la conversion de la date ou spécifier le format.

    1. Edition de la ligne
    2. La gridview récupère les valeur
    3. La gridview créés l'intance de mon objet de transfert de données
    4. La gridview assigne les valeurs
    5. ICI, mais cela correspond à quel moment? Il y a cette méthode:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      protected void SellingValueDataSource_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    6. La gridview appelle la méthode update et passe l'objet
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Grr, c'est sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    que la création de l'objet se produit.

    Le pire c'est que les dates sont correctement affichées dans le navigateur, mais au moment de la mise à jour VS considère les dates au format en-US. Si je change la culture de mon navigateur en en-US ça passe...

    Des idées?
    "Winter is coming" (ma nouvelle page d'accueil)

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    ICI, mais cela correspond à quel moment? Il y a cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void SellingValueDataSource_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    C'est juste avant l'appel à la UpdateMethod. Tu peux accéder aux valeurs des paramètres de mise à jour et éventuellement les modifier (il me semble)
    C'est ce que je te suggérais au début...

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    As-tu une idée de la façon dont je peux m'y prendre pour y accéder?
    Je peux bien atteindre la cellule du gridview, mais il ne contient que des chaine. Je ne peux pas le retyper à la volée. Tu crois que je peux atteindre une de ce méthodes?
    System.Web.UI.WebControls.ObjectDataSourceView.ConvertType(Object value, Type type, String paramName) +378
    System.Web.UI.WebControls.ObjectDataSourceView.BuildObjectValue(Object value, Type destinationType, String paramName) +167
    System.Web.UI.WebControls.ObjectDataSourceView.BuildDataObject(Type dataObjectType, IDictionary inputParameters) +214
    System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +462
    "Winter is coming" (ma nouvelle page d'accueil)

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    non, pas besoin de passer par la grille, il faut utiliser les paramètres de l'évènement

  16. #16
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Lequel?
    "Winter is coming" (ma nouvelle page d'accueil)

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    ben y en a pas 36

    e.InputParameters est un dictionnaire de paires clé/valeur, avec comme clé le nom de la propriété et la valeur sous forme de chaine

    (au fait, je sais pas si c'était clair, mais je parle de l'évènement ObjectDataSource.Updating)

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Ok, mais tu passes des paramètres dont les types sont explicites.
    Je passe un paramètre qui est un objet métier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <SelectParameters>
            <asp:Parameter Name="obj" Type="Object" />
        </SelectParameters>
    Cet objet à des propriétés qui sont des dates. Faudrait-il que je fasse une conversion dans l'accesseur? Mais comment propager la culture de façon explicite?
    Oui, mais je n'ai qu'un seul parametre, mon objet métier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.InputParameters["obj"]
    Ca se complique... Juste pour une question de support de culture.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Est-ce qu'il y a moyen d'atteindre les propriétés surlignées lors de l'appel à la méthode "GridView1_RowUpdating":



    Je voudrais transformer les dates au format "Sortable date/time pattern"
    "Winter is coming" (ma nouvelle page d'accueil)

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    a priori tu peux y accéder via e.NewValues["EndDate"]

Discussions similaires

  1. Conversion d'une chaine en date lors d'une insertion
    Par fedexpress dans le forum Développement
    Réponses: 1
    Dernier message: 27/10/2009, 13h08
  2. Réponses: 5
    Dernier message: 11/06/2009, 16h27
  3. [1.x] [crud] erreur lors de la mise à jour d'un enregistrement
    Par Mitaka dans le forum Symfony
    Réponses: 3
    Dernier message: 13/06/2008, 11h46
  4. conversion d'une chaine en date
    Par monphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/05/2007, 10h29

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