[ASPX][VB.NET] Mise à jour d'un DataSet avec un DataGrid
1 réponse
Philippe Pons
Bonjour,
Pourriez vous m'aider à résoudre ce problème?
J'ai une appli de gestion d'adhérents.
Une combo permet de sélectionner un adfhérent, le formulaire Web affiche ses
caractéristiques. Un DataGrid affiche ses ayants droit.
Je modifie une ligne du DataGrid, en mode édition, et j'enregistre la modif.
A l'aide de la collection DataKeys du Datagrid je récupère le numéro de la
ligne modifiée. Il faut ensuite pointer vers la ligne correspondante du
DataSet sous-jacent: j'utilise un DataView et sa méthode Find. Je modife
alors cette ligne du DataSet et je lance l'Update. Mais là, ça coince: ce
n'est pas le bon enregistrement qui est modifié: le Find du dataview ne
renvoie pas la bonne ligne.
Extrait du code:
===========
Code:
Private Sub dgAyd_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
dgAyd.UpdateCommand
' quelle ligne a été mise à jour?
Dim intRow As Integer
intRow = e.Item.ItemIndex
' quel est l'identifiant de cette ligne?
Dim key As String
key = dgAyd.DataKeys(intRow).ToString
' récupérer les valeurs des Nom, Prénom et Date de naissance
Dim strNom, strPrenom As String
Dim tb As TextBox
tb = CType(e.Item.Cells(0).Controls(1), TextBox)
strNom = tb.Text
tb = CType(e.Item.Cells(1).Controls(1), TextBox)
strPrenom = tb.Text
' récupérer la date de naissance
Dim strDateNaiss As String
Dim htmltextbox As HtmlInputText
htmltextbox = CType(e.Item.Cells(2).Controls(1).Controls(1),
HtmlInputText)
strDateNaiss = htmltextbox.Value
' récupérer la valeur de la liste déroulante ddlRanfFamil
Dim ddlRanfFamil As DropDownList
Dim strRanfFamil As String
ddlRanfFamil = CType(e.Item.FindControl("ddlRangFamil"),
WebControls.DropDownList)
strRanfFamil = ddlRanfFamil.SelectedItem.Text
' récupérer le numéro de la carte loisir
Dim strNumCartLois As String
tb = CType(e.Item.Cells(4).Controls(1), TextBox)
strNumCartLois = tb.Text
'=====================
' récupérer le DataSet
Dim dsAyd As DataSet = CType(Session("objAdhInd"),
adhind).getdsAyd
' si le dataset n'est pas vide
If CType(Session("objAdhInd"), adhind).bolAyantDroit Then
' trouver la ligne à modifier
Dim dav1 As DataView
dav1 = New DataView(dsAyd.Tables(0))
dav1.Sort = "ayd_id DESC" ' fixer un trie est obligatoire
Dim rowIndex As Integer
rowIndex = dav1.Find(key)
' créer une DataRow pointant vers cette ligne
Dim indexedRow As DataRow = dsAyd.Tables(0).Rows(rowIndex)
' mettre à jour cette ligne
indexedRow("ayd_nom") = strNom
indexedRow("ayd_prenom") = strPrenom
et la , c'est pas la bonne ligne qui est mise à jour!!
Y a t il une erreur de programmation?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Norm
Piste à regarder: Je n'ai jamais utilisé cette méthode, mais "dav1.Sort = "ayd_id DESC" va changer l'orde donc la key trouvé ne pointerais plus sur la meme enregistrement car celui-ci à changer de position?
"Philippe Pons" a écrit dans le message de news:
Bonjour,
Pourriez vous m'aider à résoudre ce problème? J'ai une appli de gestion d'adhérents. Une combo permet de sélectionner un adfhérent, le formulaire Web affiche ses caractéristiques. Un DataGrid affiche ses ayants droit. Je modifie une ligne du DataGrid, en mode édition, et j'enregistre la modif. A l'aide de la collection DataKeys du Datagrid je récupère le numéro de la ligne modifiée. Il faut ensuite pointer vers la ligne correspondante du DataSet sous-jacent: j'utilise un DataView et sa méthode Find. Je modife alors cette ligne du DataSet et je lance l'Update. Mais là, ça coince: ce n'est pas le bon enregistrement qui est modifié: le Find du dataview ne renvoie pas la bonne ligne.
Extrait du code: ========== > Code: Private Sub dgAyd_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgAyd.UpdateCommand ' quelle ligne a été mise à jour? Dim intRow As Integer intRow = e.Item.ItemIndex ' quel est l'identifiant de cette ligne? Dim key As String key = dgAyd.DataKeys(intRow).ToString ' récupérer les valeurs des Nom, Prénom et Date de naissance Dim strNom, strPrenom As String Dim tb As TextBox tb = CType(e.Item.Cells(0).Controls(1), TextBox) strNom = tb.Text tb = CType(e.Item.Cells(1).Controls(1), TextBox) strPrenom = tb.Text ' récupérer la date de naissance Dim strDateNaiss As String Dim htmltextbox As HtmlInputText htmltextbox = CType(e.Item.Cells(2).Controls(1).Controls(1), HtmlInputText) strDateNaiss = htmltextbox.Value ' récupérer la valeur de la liste déroulante ddlRanfFamil Dim ddlRanfFamil As DropDownList Dim strRanfFamil As String ddlRanfFamil = CType(e.Item.FindControl("ddlRangFamil"), WebControls.DropDownList) strRanfFamil = ddlRanfFamil.SelectedItem.Text ' récupérer le numéro de la carte loisir Dim strNumCartLois As String tb = CType(e.Item.Cells(4).Controls(1), TextBox) strNumCartLois = tb.Text '==================== > ' récupérer le DataSet Dim dsAyd As DataSet = CType(Session("objAdhInd"), adhind).getdsAyd ' si le dataset n'est pas vide If CType(Session("objAdhInd"), adhind).bolAyantDroit Then ' trouver la ligne à modifier Dim dav1 As DataView dav1 = New DataView(dsAyd.Tables(0)) dav1.Sort = "ayd_id DESC" ' fixer un trie est obligatoire Dim rowIndex As Integer rowIndex = dav1.Find(key) ' créer une DataRow pointant vers cette ligne Dim indexedRow As DataRow = dsAyd.Tables(0).Rows(rowIndex) ' mettre à jour cette ligne indexedRow("ayd_nom") = strNom indexedRow("ayd_prenom") = strPrenom
et la , c'est pas la bonne ligne qui est mise à jour!! Y a t il une erreur de programmation?
Merci d'avance Philippe
Piste à regarder:
Je n'ai jamais utilisé cette méthode, mais "dav1.Sort = "ayd_id DESC" va
changer l'orde
donc la key trouvé ne pointerais plus sur la meme enregistrement
car celui-ci à changer de position?
"Philippe Pons" <Philippe.Pons19_nospam@wanadoo.fr> a écrit dans le message
de news: OVueDYpNFHA.2356@TK2MSFTNGP14.phx.gbl...
Bonjour,
Pourriez vous m'aider à résoudre ce problème?
J'ai une appli de gestion d'adhérents.
Une combo permet de sélectionner un adfhérent, le formulaire Web affiche
ses
caractéristiques. Un DataGrid affiche ses ayants droit.
Je modifie une ligne du DataGrid, en mode édition, et j'enregistre la
modif.
A l'aide de la collection DataKeys du Datagrid je récupère le numéro de la
ligne modifiée. Il faut ensuite pointer vers la ligne correspondante du
DataSet sous-jacent: j'utilise un DataView et sa méthode Find. Je modife
alors cette ligne du DataSet et je lance l'Update. Mais là, ça coince: ce
n'est pas le bon enregistrement qui est modifié: le Find du dataview ne
renvoie pas la bonne ligne.
Extrait du code:
========== > Code:
Private Sub dgAyd_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
dgAyd.UpdateCommand
' quelle ligne a été mise à jour?
Dim intRow As Integer
intRow = e.Item.ItemIndex
' quel est l'identifiant de cette ligne?
Dim key As String
key = dgAyd.DataKeys(intRow).ToString
' récupérer les valeurs des Nom, Prénom et Date de naissance
Dim strNom, strPrenom As String
Dim tb As TextBox
tb = CType(e.Item.Cells(0).Controls(1), TextBox)
strNom = tb.Text
tb = CType(e.Item.Cells(1).Controls(1), TextBox)
strPrenom = tb.Text
' récupérer la date de naissance
Dim strDateNaiss As String
Dim htmltextbox As HtmlInputText
htmltextbox = CType(e.Item.Cells(2).Controls(1).Controls(1),
HtmlInputText)
strDateNaiss = htmltextbox.Value
' récupérer la valeur de la liste déroulante ddlRanfFamil
Dim ddlRanfFamil As DropDownList
Dim strRanfFamil As String
ddlRanfFamil = CType(e.Item.FindControl("ddlRangFamil"),
WebControls.DropDownList)
strRanfFamil = ddlRanfFamil.SelectedItem.Text
' récupérer le numéro de la carte loisir
Dim strNumCartLois As String
tb = CType(e.Item.Cells(4).Controls(1), TextBox)
strNumCartLois = tb.Text
'==================== > ' récupérer le DataSet
Dim dsAyd As DataSet = CType(Session("objAdhInd"),
adhind).getdsAyd
' si le dataset n'est pas vide
If CType(Session("objAdhInd"), adhind).bolAyantDroit Then
' trouver la ligne à modifier
Dim dav1 As DataView
dav1 = New DataView(dsAyd.Tables(0))
dav1.Sort = "ayd_id DESC" ' fixer un trie est obligatoire
Dim rowIndex As Integer
rowIndex = dav1.Find(key)
' créer une DataRow pointant vers cette ligne
Dim indexedRow As DataRow =
dsAyd.Tables(0).Rows(rowIndex)
' mettre à jour cette ligne
indexedRow("ayd_nom") = strNom
indexedRow("ayd_prenom") = strPrenom
et la , c'est pas la bonne ligne qui est mise à jour!!
Y a t il une erreur de programmation?
Piste à regarder: Je n'ai jamais utilisé cette méthode, mais "dav1.Sort = "ayd_id DESC" va changer l'orde donc la key trouvé ne pointerais plus sur la meme enregistrement car celui-ci à changer de position?
"Philippe Pons" a écrit dans le message de news:
Bonjour,
Pourriez vous m'aider à résoudre ce problème? J'ai une appli de gestion d'adhérents. Une combo permet de sélectionner un adfhérent, le formulaire Web affiche ses caractéristiques. Un DataGrid affiche ses ayants droit. Je modifie une ligne du DataGrid, en mode édition, et j'enregistre la modif. A l'aide de la collection DataKeys du Datagrid je récupère le numéro de la ligne modifiée. Il faut ensuite pointer vers la ligne correspondante du DataSet sous-jacent: j'utilise un DataView et sa méthode Find. Je modife alors cette ligne du DataSet et je lance l'Update. Mais là, ça coince: ce n'est pas le bon enregistrement qui est modifié: le Find du dataview ne renvoie pas la bonne ligne.
Extrait du code: ========== > Code: Private Sub dgAyd_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgAyd.UpdateCommand ' quelle ligne a été mise à jour? Dim intRow As Integer intRow = e.Item.ItemIndex ' quel est l'identifiant de cette ligne? Dim key As String key = dgAyd.DataKeys(intRow).ToString ' récupérer les valeurs des Nom, Prénom et Date de naissance Dim strNom, strPrenom As String Dim tb As TextBox tb = CType(e.Item.Cells(0).Controls(1), TextBox) strNom = tb.Text tb = CType(e.Item.Cells(1).Controls(1), TextBox) strPrenom = tb.Text ' récupérer la date de naissance Dim strDateNaiss As String Dim htmltextbox As HtmlInputText htmltextbox = CType(e.Item.Cells(2).Controls(1).Controls(1), HtmlInputText) strDateNaiss = htmltextbox.Value ' récupérer la valeur de la liste déroulante ddlRanfFamil Dim ddlRanfFamil As DropDownList Dim strRanfFamil As String ddlRanfFamil = CType(e.Item.FindControl("ddlRangFamil"), WebControls.DropDownList) strRanfFamil = ddlRanfFamil.SelectedItem.Text ' récupérer le numéro de la carte loisir Dim strNumCartLois As String tb = CType(e.Item.Cells(4).Controls(1), TextBox) strNumCartLois = tb.Text '==================== > ' récupérer le DataSet Dim dsAyd As DataSet = CType(Session("objAdhInd"), adhind).getdsAyd ' si le dataset n'est pas vide If CType(Session("objAdhInd"), adhind).bolAyantDroit Then ' trouver la ligne à modifier Dim dav1 As DataView dav1 = New DataView(dsAyd.Tables(0)) dav1.Sort = "ayd_id DESC" ' fixer un trie est obligatoire Dim rowIndex As Integer rowIndex = dav1.Find(key) ' créer une DataRow pointant vers cette ligne Dim indexedRow As DataRow = dsAyd.Tables(0).Rows(rowIndex) ' mettre à jour cette ligne indexedRow("ayd_nom") = strNom indexedRow("ayd_prenom") = strPrenom
et la , c'est pas la bonne ligne qui est mise à jour!! Y a t il une erreur de programmation?