InserButton [Résolu]

Signaler
Messages postés
29
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
14 mai 2013
-
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
-
bonjour;
j'ai posé une question depuis 2 jours et je n'ai reçu aucune réponse!!!


je reformule la question: je veux faire l'insertion d'un enregistrement dans la source de donnée via le contrôle GridView en utiliant une colonne de type CommandField.
mon GridView et rempli et à coté je dois avoir la possibilité de faire l'ajout . mais je sais pas comment le faire!

y'a quelqu'un qui pourrait m'aider svp?

8 réponses

Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonjour,

Je crois que tu confonds gridview et detailsview, ce dernier contrôle admettant l'insert et ayant une propriété AutoGenerateRows.
Si tu veux faire l'insert par le detailsview, tu peux mettre son DefaultMode à "Insert" en spécifiant un insertcommand.

GGtry
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonsoir,

"patience et longueur de temps font plus que force ni que rage".
Sauf erreur, un GridView n'a pas d'insert dans ses commandfields.
D'autre part, avoir un bouton "insert" sur chaque cellule d'une colonne serait plutôt bizarre, puisqu'il s'agit de faire une nouvelle entrée dans la table, et non pas de changer quelque chose à la ligne sur laquelle se trouverait le button...

Pour passer par le gridview, une solution possible est d'ajouter des textbox dans le footer avec un bouton "insérer". Je ne sais pas comment insérer un contrôle dans le footer en asp, mais c'est possible en vb, par exemple. C'est juste un peu ennuyeux pour la gestion des événements...
Dans l'exemple ci-dessous, un button est mis dans la première cellule du footer, et des textbox dans les cellules 2 et 3 :

 Protected Sub GridView1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        Call creation()
    End Sub
   
    Sub creation()     
        GridView1.FooterRow.Cells(0).Controls.Clear()
        GridView1.FooterRow.Cells(2).Controls.Clear()
        GridView1.FooterRow.Cells(3).Controls.Clear()
        Dim bt As Button = New Button
        bt.Text = "Insérer"
        bt.ID = "bt"
        Dim tb1 As New TextBox
        Dim tb2 As New TextBox
        tb1.ID = "tb1"
        tb2.ID = "tb2"
        GridView1.FooterRow.Cells(0).Controls.Add(bt)
        GridView1.FooterRow.Cells(2).Controls.Add(tb1)
        GridView1.FooterRow.Cells(3).Controls.Add(tb2)  
        AddHandler bt.Click, AddressOf btinsert   
    End Sub


    Protected Sub GridView1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)  
        Call creation()   
    End Sub


    Protected Sub btinsert(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim tb1 As TextBox = CType(GridView1.FooterRow.FindControl("tb1"), TextBox)
        Dim tb2 As TextBox = CType(GridView1.FooterRow.FindControl("tb2"), TextBox)
        Dim com As String = "INSERT INTO TaTable (Champ1, Champ2t) VALUES ('" & tb1.Text & "'," & tb2.Text & ")"
        SqlDataSource1.InsertCommand = com
        SqlDataSource1.Insert()
    End Sub

GGtry
Messages postés
29
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
14 mai 2013

bonsoir;


dans les anciennes versions de Vs.net n'existait pas l'ajout dans la colonne CommandField mais ça existe dans la version 2008.
j'ai cherché dans le site de microsoft j'ai trouvé qu'il mettent la propriété AutoGenerateRows à false hors  moi je trouve pas cette propriété j'ai juste AutoGenerateColumns.


en tt cas merci pour ta réponse, je vais voir le essayer avec le code que tu m'a envoyé.


 
Messages postés
29
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
14 mai 2013

salut!
merci pour ta réponse, j'ai vérifié sur le site de microsoft ils ont précisé que insertButton n'est prit en compte que pour certains controles comme le DetailsView, mais je me demande qu'elle est son utilité dans un gridView, si ça existe il doit servire à quelque chose!!!


autre question, j'ai fait l'edition puis lamise à jour d'un enregistremnt dans une source de donnée mais je dois cliquer 2 fois sur "modifier" pour qu'il me donne la possibilitéb de saisir les valeurs que je veux. la même chose se passe avec la pagination, je dois cliquer 2 fois pour aller à une autre page.

merci pour ton aide
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonsoir,

Le code donné ci-dessus te permettra de faire un insert directement à partir du gridview : il marche aussi avec une pagination. Le truc embêtant est qu'il faut appeler deux fois la création du button et des textbox, du fait que l'insert provoque un nouveau "bind" de la gridview. D'où le clear des controles puisque sur un postback normal, sans insert, la gridview ne sera pas rebindée et les contrôles apparaîtront deux fois... La requête n'est pas paramétrée, donc danger...

Pour le second problème, je ne vois pas. Cela arrive parfois avec du javascript, et le problème doit se poser de ce côté. Il ne se passe rien du tout lors du premier clic ? ou y a-t-il quand même un post, mais sans effet ? N'ayant pas le problème de mon côté, je n'en comprends pas la raison. As-tu par hasard de l'ajax sur ta page ?
Sinon, montre ton code, pour essayer de reproduire le problème.

GGtry
Messages postés
29
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
14 mai 2013

dans Page_Load j'écris


' connection à la base de donnée



......
'je remplis mon dataset






da.Fill(ds,




"table"

)
'dt c'est mon datatable







dt = ds.Tables("table")









If
Page.IsPostBack =

False




Then




GridV.DataSource = dt



GridV.DataBind()








End



If











End



Sub




'dans l'événement RowEditing j'écris:

GridV.EditIndex = e.NewEditIndex








End



Sub









'dans l'événement RowUpdating j'écris










Dim
T

As



TextBox

T = GridV.Rows(e.RowIndex).Cells(2).Controls(0)








Dim
id

As




Integer



= GridView2.DataKeys(e.RowIndex).Value

'com est mon objet command

com.CommandText =





"UPDATE  Table  SET chp='"
& T.Text &

"' WHERE identifiant= '"

& id &

"'"




com.ExecuteNonQuery()





Response.Redirect(




"mapage.aspx"

)






End



Sub
Messages postés
29
Date d'inscription
samedi 20 décembre 2008
Statut
Membre
Dernière intervention
14 mai 2013

dans Page_Load j'écris


' connection à la base de donnée



......
'je remplis mon dataset






da.Fill(ds,




"table"

)
'dt c'est mon datatable







dt = ds.Tables("table")









If
Page.IsPostBack =

False




Then




GridV.DataSource = dt



GridV.DataBind()








End



If











End



Sub




'dans l'événement RowEditing j'écris:

GridV.EditIndex = e.NewEditIndex








End



Sub









'dans l'événement RowUpdating j'écris










Dim
T

As



TextBox

T = GridV.Rows(e.RowIndex).Cells(2).Controls(0)








Dim
id

As




Integer



= GridV.DataKeys(e.RowIndex).Value

'com est mon objet command

com.CommandText =





"UPDATE  Table  SET chp='"
& T.Text &

"' WHERE identifiant= '"

& id &

"'"




com.ExecuteNonQuery()





Response.Redirect(




"mapage.aspx"

)






End



Sub
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonjour,

Je ne suis pas sûr, car je n'utilise pas en général les datasets et les datatables. Mais il est possible que tu aies un problème avec le databind. Je ne suis pas sûr de comprendre exactement comment tu fais, mais il se peut que le databind opéré sur le load empêche que les événements d'édition ou de pagination soient pris en compte du premier coup.
Essaie de rebinder à ta source dans ces événements... (il me semble que c'est pour cela que tu utilises response.redirect, mais ce n'est pas a priori une bonne idée, notamment si tu as une pagination).

GGtry