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 :

[ASP.NET 2.0][C#] Clé composée dans un GridView


Sujet :

ASP.NET

  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut [ASP.NET 2.0][C#] Clé composée dans un GridView
    Bonjour à tous

    Je reprend le sujet "[GridView] Récupérer une valeur d'une colonne invisilbe", j'ai posté une réponse alors qu'il était Résolu et je m'en excuse.

    Ma situation est la suivante.

    Je remplis un GridView à l'aide d'une ObjectDataSource qui traite une procédure stockée.
    J'ai dans ce même GridView, une colonne CommandField avec une bouton select qui me permet (en théorie) d'afficher les détails dans un DetailView toujours à l'aide d'une ObjectdataSource en indiquant que les paramètres sont les valeurs sélectionnées dans le GridView.

    Le truc c'est qu'il ne se passe rien quand je clique sur ce bouton select. La clé qui me permet de sélectionner la bonne est composée de 2 champs.

    Quand je fais un Debug, j'ai pu remarqué que la 2è clé reprennait la valeur de la première.

    Dans mon code HTML, au niveau du gridview je ne met rien en ce qui concerne les DataKeyNames et dans le code behind je rajoute ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string[] dtk1 = new string[] { "clé1" , "clé2" };
            GridView1.DataKeyNames = dtk1;
    J'ai aussi mis la propriété "ReadOnly" de ces 2 colonnes à TRUE et ça ne marche toujours pas.
    Pourtant quand on regarde un peu partout dans les aides, ils disent bien que c'est la virgule qui sert de séparateur entre les champs.

    J'espère avoir été asser clair dans mon explication.

    Merci d'avance pour vos réponse.

  2. #2
    Membre confirmé Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Par défaut
    Bonjour,
    la méthode pour déclarer des clés multiples est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GridView1.DataKeyNames = "clé1,clé2";

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    Citation Envoyé par DoRiane
    Bonjour,
    la méthode pour déclarer des clés multiples est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GridView1.DataKeyNames = "clé1,clé2";
    J'ai essayé comme tu as fait et ça ne passe pas, il attends une liste.
    Il me met cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error Cannot implicitly convert type 'string' to 'string[]'

  4. #4
    Membre confirmé Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Par défaut
    Tu peux essayer comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    StringArrayConverter _convert = new StringArrayConverter();
    GridView1.DataKeyNames = (String[])_convert.ConvertFrom("clé1,clé2");
    Autre solution si tu peux,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <asp:GridView ID="GridView1" DataKeyNames="clé1,clé2" runat="server"> ...</asp:GridView>

  5. #5
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    Citation Envoyé par DoRiane
    Tu peux essayer comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    StringArrayConverter _convert = new StringArrayConverter();
    GridView1.DataKeyNames = (String[])_convert.ConvertFrom("clé1,clé2");
    Autre solution si tu peux,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <asp:GridView ID="GridView1" DataKeyNames="clé1,clé2" runat="server"> ...</asp:GridView>
    La 2è solution, j'avais déjà testé sans succès.
    La 1ère, je viens d'y faire à l'instant, fonctionne pas non plus.

    Dans le DetailView, j'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:DetailView ID="DetailView1" DataKeyNames="clé1,clé2" runat="server"> ...</asp:DetailView>
    Je ne sais pas si c'est important, mais ma table SQL n'a pa de clé primaire, je l'ai prise telle qu'elle vu que ça fait un bon moment qu'elle existe.

    Je sais pas si c'est exact, je débute en ASP.NET 2.0

  6. #6
    Membre confirmé Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Par défaut
    Le problème ne vient probablement pas du DataKeyNames.

    Peux-tu montrer ton code ?

  7. #7
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    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
    <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False"
                    HeaderStyle-BackColor="#A8003E" HeaderStyle-ForeColor="#FFFFFF" HeaderStyle-HorizontalAlign="Center"
                    ForeColor="Black"
                    AlternatingRowStyle-BackColor="#eeeeee" 
                    SelectedRowStyle-BackColor="#B0C4DE" BorderColor="White" HorizontalAlign="Center" AllowSorting="True" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" EnableViewState="False" 
                    >
                        <Columns>
                            <asp:CommandField CausesValidation="False" InsertVisible="False" ShowSelectButton="True" />
                            <asp:BoundField DataField="LV_COMM" HeaderText="Nr Order" SortExpression="LV_COMM" ReadOnly="True" />
                            <asp:BoundField DataField="LV_LIGN" HeaderText="Pos." ReadOnly="True"/>
                            <asp:BoundField DataField="TV_RCLI" HeaderText="Client" SortExpression="TV_RCLI" />
                            <asp:BoundField DataField="LV_QCOM" HeaderText="Oder Qty" />
                            <asp:BoundField DataField="LV_QRES" HeaderText="Rem. Qty" SortExpression="LV_QRES" />
                            <asp:BoundField DataField="LV_DESI" HeaderText="Description" SortExpression="LV_DESI" />
                            <asp:BoundField DataField="LV_DLIV" DataFormatString="{0:MM/dd/yyyy}" HeaderText="Sales Deliv"
                                HtmlEncode="False" SortExpression="LV_DLIV" />
                            <asp:BoundField DataField="LV_DACC" DataFormatString="{0:MM/dd/yyyy}" HeaderText="Mfg Deliv"
                                HtmlEncode="False" SortExpression="LV_DACC" />
                        </Columns>
                        <SelectedRowStyle BackColor="LightSteelBlue" />
                        <HeaderStyle BackColor="#A8003E" ForeColor="White" HorizontalAlign="Center" />
                        <AlternatingRowStyle BackColor="#EEEEEE" />
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td>             
                    <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
                        DataSourceID="ObjectDataSource3" BorderColor="#A8003E" Height="50px" Width="463px"
                     ForeColor=Black AlternatingRowStyle-BackColor="#cccccc" DataKeyNames="LV_COMM,LV_LIGN" HorizontalAlign="Left">
                        <Fields>
                            <asp:BoundField DataField="LV_COMM" HeaderText="Nr Order" ReadOnly="True" />
                            <asp:BoundField DataField="LV_LIGN" HeaderText="Pos." ReadOnly="True" />
                        </Fields>
                        <AlternatingRowStyle BackColor="#EEEEEE" />
                    </asp:DetailsView>

    Je sais pas si ça te suffi

  8. #8
    Membre confirmé Avatar de DoRiane
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Par défaut
    Et le DataSource ?

    Par contre il faut bien que tu mettes le DataKeyNames sur le gridView aussi

  9. #9
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    le code du DataSource est décomposé en 2 partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public DataSet SelectDetailLigveM(float LV_COMM, float LV_LIGN)
        {
            DataSet ds = new DataSet();
            ds = Module1.DsDetailLigve_M(LV_COMM,LV_LIGN);
     
            ds.Tables.Add(new DataTable());
            return ds;
        }
    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
     
     SqlConnection SqlConn1;
            // Accès à la base de données PRODUFLEX
            SqlConn1 = PRODUConn();
     
            // Appel à la procédure stockée
            SqlCommand cmd = new SqlCommand("sp_SelectDetailLigve_M", SqlConn1);
            cmd.CommandType = CommandType.StoredProcedure;
     
            SqlDataAdapter Adpt = new SqlDataAdapter();
            Adpt.SelectCommand = cmd;
     
            SqlParameter Prm1 = cmd.Parameters.Add("@lv_comm", lv_comm);
            Prm1.SqlDbType = SqlDbType.Float;
     
            SqlParameter Prm2 = cmd.Parameters.Add("@lv_lign", lv_lign);
            Prm2.SqlDbType = SqlDbType.Float;
     
            DataSet da = new DataSet();
     
            try
            {
                if (SqlConn1 != null)
                    SqlConn1.Close();
     
                SqlConn1.Open();
                Adpt.Fill(da);
            }
            finally
            {
                if (SqlConn1 != null)
                    SqlConn1.Close();
            }
            return da;
    La DataSource est un objectdatasource

  10. #10
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Si tu mets les DataKeyNames dans la aspx comme te l'a montré DoRiane

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <asp:GridView ID="GridView1" DataKeyNames="clé1,clé2" runat="server"> ...</asp:GridView>

    Il est où le problème ensuite ?

  11. #11
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    Le problème ensuite, c'est qu'il répète la 1ère clé sur la 2è.
    Je l'ai vu quand je suis passé en mode Debug.

  12. #12
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    vérifie lors du binding la valeur de la clé2

  13. #13
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    clé1 = clé2
    Je le vérifie quand je fais un debug.
    Les paramètres qui sont passés à ma procédure stockée sont 2 fois les mêmes pour deux champs différents.

    Si je récupère la valeur du DataKeyNames je vois:
    clé1cl2 collé ensemble est-ce que c'est normal ?

  14. #14
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    Bonjour,

    Je me permet de relancer le sujet.
    Je sais que la réponse est pas facile à trouver et je suis comme vous je me creuse le cerveau et surtout sur Internet pour trouver une solution à mon problème.


    Je ne sais pas trop quoi vous dire pour essayer d'être plus précis.
    Tout ce que je sais, c'est que pour le moment en essayant avec une seule clé cela passe sans problème.

    En tout cas, c'est pas grave si pour le moment on a pas de réponse.
    Mais dès que j'ai la solution je vous la fait partager.

  15. #15
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Par défaut
    Bonjour,

    Vous allez être content, le problème est résolu.
    J'avoue j'ai beaucoup beaucoup cherché sur tous les forums ASP.NET
    Je vais donc mettre la solution au problème pour celles et ceux qui auront le même problème.

    Dans le code HTML de l'ObjectDataSource (ou tout autre source Sql):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <asp:ObjectDataSource ID="ObjectDataSource3" runat="server" SelectMethod="SelectMethodName"
            TypeName="RqstLigVe">
            <SelectParameters>
                <asp:ControlParameter ControlID="GridView1" Name="clé1" 
    PropertyName="SelectedDataKey.Values[0]"
                    Type="Int32" />
                <asp:ControlParameter ControlID="GridView1" Name="clé2" 
    PropertyName="SelectedDataKey.Values[1]"
                    Type="Int32" />
            </SelectParameters>
        </asp:ObjectDataSource>
    Dans le code-behind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            string[] dtk1 = new string[] { "clé1","clé2" };
            GridView1.DataKeyNames = dtk1;
    Voilà voilà

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

Discussions similaires

  1. [ASP.NET 2.0][C#] Comment écrire dans un fichier Excel ?
    Par Louisa dans le forum Accès aux données
    Réponses: 8
    Dernier message: 19/12/2012, 18h43
  2. Réponses: 6
    Dernier message: 18/10/2007, 15h09
  3. [ASP.NET 2.0] Problème d'edition dans un datagrid
    Par florent-k dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/08/2007, 15h52
  4. Réponses: 3
    Dernier message: 18/04/2007, 11h25
  5. Réponses: 5
    Dernier message: 28/11/2005, 09h52

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