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 :

Modifier le type de control dans un gridview en mode edit


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Modifier le type de control dans un gridview en mode edit
    Bonjour à tous

    J'ai un GridView et je voudrais changer le type de certains controle en mode Edit. Je m'explique :
    - au chargement de la page mon GridView affiche le champ "modifier" et trois champs texte.
    - en cliquant sur "modifier" les champs texte, tout naturellement, se transforme en TextBox

    Je voudrais que le premier champ texte ne soit pas modifiable tout en étant afficher, le laisser en label m'irait trés bien.
    Le deuxième champ, je voudrais que cela devienne une liste déroulante, que je chargerais dans le CodeBehind. La valeur sélectionnée devant allé directement dans la base de donnée, te que, sans modification.

    Je cherche sur Google depuis deux heures mais je trouve pas. J'ai parcouru la MSDN et j'ai rien trouvé qui corresponde à ce que je veux faire, mais, comme d'habitude, je ne fois pas employer les bons mot clé.

    Pouvez vous m'aider ?

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 106
    Points
    3 106
    Par défaut
    Salut Zooffy,

    passe par des templateFields.
    Tu définis ton ItemTemplate pour la partie non éditable et tu ajoutes dans un EditItemTemplate les contrôles Textbox et DropDownList dont tu as besoin dedans.
    Tu peux binder ta DDL dans l'évènement ItemDataBound de ta grid.

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    J'avais trés peur de cette réponse, mais bon, quand faut y aller, faut y aller.
    En fait, j'en ai un peu marre de passer toujours par des templats dés que je veux faire un truc un poil en dehors des clous. Pourtant, fan de Microsoft que je suis, je dois bien avouer que là, ils ont pas fait beaucoup d'effort.

    Bref, j'ai fais un Template, sauf que ça marche pas !!!

    Alors, en gros, des tempalte j'en ai déjà fais, mais pour afficher des trucs spéciaux, pas pour modifier. Du coup, j'ai dû oublier quelque chose, tout bête. J'ai lu et relu la MSDN sur ce sujet, mais c'est pas trés clair.

    Je te soumet mon code, peut-être verras tu l'erreur :

    Définition du GridView :
    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
     
    Protected Sub InitGvComposant(ByVal PageId As String)
            Try
                With sdsComposantPage
                    .SelectCommandType = SqlDataSourceCommandType.Text
                    .UpdateCommandType = SqlDataSourceCommandType.Text
                    .SelectCommand = "EXEC dbo.EG_ListeComposants '" & PageId & "'"
                    .UpdateCommand = "UPDATE CORE_Composant SET Compo_Cph = @Compo_Cph, Compo_Ordre = @Compo_Ordre WHERE ComposantId = @ComposantId"
     
                End With
                Dim bfNomComposant, bfCphComposant, bfOrdreComposant As New BoundField
                With bfNomComposant
                    .HeaderText = "Nom du composant"
                    .DataField = "Compo_Nom"
                End With
                With bfCphComposant
                    .HeaderText = "Position du Composant"
                    .DataField = "Compo_Cph"
     
                End With
                With bfOrdreComposant
                    .HeaderText = "Ordre du Composant"
                    .DataField = "Compo_Ordre"
                End With
                Dim ddlCPH As New TemplateField
                With ddlCPH
                    .EditItemTemplate = New gvtmp(DataControlRowType.DataRow, "Compo_Cph", "Edit")
                    .ItemTemplate = New gvtmp(DataControlRowType.DataRow, "Compo_Cph", "Item")
                    .HeaderTemplate = New gvtmp(DataControlRowType.Header, "Compo_Cph", "Position du Composant")
                End With
                Dim NomCompo As New TemplateField
                With NomCompo
                    .EditItemTemplate = New gvtmp(DataControlRowType.DataRow, "Compo_Nom", "Bloque")
                    .ItemTemplate = New gvtmp(DataControlRowType.DataRow, "Compo_Nom", "Item")
                    .HeaderTemplate = New gvtmp(DataControlRowType.Header, "Compo_Nom", "Nom du composant")
                End With
     
                With gvComposantPage
                    .AutoGenerateColumns = False
                    .AutoGenerateEditButton = True
     
                    With .Columns
                        .Clear()
                        .Add(bfNomComposant)
                        .Add(bfCphComposant)
                        .Add(bfOrdreComposant)
                        .Add(ddlCPH)
                        .Add(NomCompo)
                    End With
                    .DataBind()
     
                End With
            Catch ex As Exception
                Logage("InitGVComposant : " & ex.Message)
            End Try
     
        End Sub
    Rien de phénoménal, un déclaration classique. La redite de deux champs, c'est normal, c'estle temps de bosser sur le template, aprés, je les vire.

    Et maintenant la classe du Template :
    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
     
    Class gvtmp
        Implements ITemplate
     
        Private templateType As DataControlRowType
        Private columnName, columnType As String
     
        Sub New(ByVal type As DataControlRowType, ByVal colname As String, ByVal coltype As String)
            templateType = type
            columnName = colname
            columnType = coltype
        End Sub
     
        Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
            Select Case templateType
                Case DataControlRowType.DataRow
                    Select Case columnType
                        Case "Edit"
                            Dim ddl As New DropDownList
                            AddHandler ddl.DataBinding, AddressOf EditDDL_DataBinding
                            container.Controls.Add(ddl)
                        Case "Item"
                            Dim l As New Label
                            AddHandler l.DataBinding, AddressOf Item_DataBinding
                            container.Controls.Add(l)
                        Case "Bloque"
                            Dim l As New Label
                            AddHandler l.DataBinding, AddressOf Bloque_DataBinding
                            container.Controls.Add(l)
                    End Select
                Case DataControlRowType.Header
                    Dim lc As New Literal
                    lc.Text = "<b>" & columnType & "</b>"
                    container.Controls.Add(lc)
            End Select
        End Sub
     
        Private Sub Item_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
            Dim l As Label = CType(sender, Label)
            Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
            l.Text = DataBinder.Eval(row.DataItem, "Compo_Cph").ToString()
        End Sub
     
        Private Sub Bloque_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
            Dim l As Label = CType(sender, Label)
            Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
            l.Text = DataBinder.Eval(row.DataItem, "Compo_Nom").ToString()
        End Sub
     
        Private Sub EditDDL_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
            Dim ddl As DropDownList = CType(sender, DropDownList)
            Dim row As GridViewRow = CType(ddl.NamingContainer, GridViewRow)
            With ddl
                With .Items
                    .Add(New ListItem("A Gauche", "CphGauche"))
                    .Add(New ListItem("Au centre", "CphCentral"))
                    .Add(New ListItem("A Droite", "CphDroite"))
                End With
                .SelectedValue = DataBinder.Eval(row.DataItem, "Compo_Cph").ToString()
            End With
        End Sub
    End Class
    Le symptome est simple : à l'affichage, j'ai bon, j'ai les champs et les valeurs qui vont bien. Lorsque je click sur "Modifier" les deux champs du Template sont vides, pas d'entête, pas de donnée, rien du tout.

    Et je vois pas bien ce que j'ai pu oublier.

    Merci pour ton aide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/12/2009, 15h52
  2. Réponses: 1
    Dernier message: 07/04/2009, 17h32
  3. [C#] Accéder au contenu d'un textbox dans un Gridview en mode edit.
    Par slideveloppeur2006 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 23/04/2008, 12h19
  4. Réponses: 2
    Dernier message: 20/01/2008, 16h04
  5. Réponses: 3
    Dernier message: 17/07/2006, 17h42

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