OVH Cloud OVH Cloud

ADO .net sur ASP .net

11 réponses
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut,

J'utilise une DataTable que je fabrique dynamiquement au chargement d'une
page.

Chaque fois que je clique sur un bouton sur la webform je voudrais ajouter
un élément dans cette table.

J'arrive bien à ajouter l'élément mais à chaque fois, je perd le contenu
précédent...

Voici ma déclaration :
(j'ai enlevé ce qui ne concernait pas la question)

Public Class Welcome
Inherits System.Web.UI.Page

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

'**** Préparation de la datatable
Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))

End Sub

Protected WithEvents oDT_Rooms As New System.Data.DataTable

Voici le code du bouton

Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdAddRow.Click
Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
Dim szHTML As String
If cbxRooms.SelectedValue <> -1 Then
'**** Ajout de la ligne à la table en mémoire
Row("Code") = cbxRooms.SelectedValue
Row("txtNom") = cbxRooms.SelectedItem
Row("intPaxMax") = CLng(txtPers.Text)
Row("curPrix") = CSng(txtPrix.Text)
oDT_Rooms.Rows.Add(Row)
'**** Construction de la chaine HTML
For Each Row In oDT_Rooms.Rows
bla bla bla ' constat que la table n'a qu'une ligne... :(
Next
End If
End Sub
End Class

Quelqu'un pourrait-il m'aider ?

D'avance merci...

@+

LJ

10 réponses

1 2
Avatar
Bonjour,

en fait le protocol http n'a pas d'état donc a chaque fois que l'on recharge
une page on efface tout ce qu'il y avait avant plusieurs solutions pour
conserver les informations a chaque postback de la page


1- Viewstate : on stocke dans la page envoyé au client les informations cela
alourdi la page envoyé augmente le temps de réponse bref pas le plus souple

2- GloBal.asax : on stocke les datatable dans une variable de session voir
d'application si elle concerne l'application asp et non pas juste un user

3- On stocke dans une base de donnée

4 - on stocke dans un cookie mais attention il faut tester que le navigateur
du client accepte les cookie donc prévoir une solution de replie

Sebastien


"Laurent Jordi (www.ezlogic.mc)" <inf[o]@ezlogic.mc> a écrit dans le message
de news:%
Salut,

J'utilise une DataTable que je fabrique dynamiquement au chargement d'une
page.

Chaque fois que je clique sur un bouton sur la webform je voudrais ajouter
un élément dans cette table.

J'arrive bien à ajouter l'élément mais à chaque fois, je perd le contenu
précédent...

Voici ma déclaration :
(j'ai enlevé ce qui ne concernait pas la question)

Public Class Welcome
Inherits System.Web.UI.Page

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

'**** Préparation de la datatable
Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))

End Sub

Protected WithEvents oDT_Rooms As New System.Data.DataTable

Voici le code du bouton

Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdAddRow.Click
Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
Dim szHTML As String
If cbxRooms.SelectedValue <> -1 Then
'**** Ajout de la ligne à la table en mémoire
Row("Code") = cbxRooms.SelectedValue
Row("txtNom") = cbxRooms.SelectedItem
Row("intPaxMax") = CLng(txtPers.Text)
Row("curPrix") = CSng(txtPrix.Text)
oDT_Rooms.Rows.Add(Row)
'**** Construction de la chaine HTML
For Each Row In oDT_Rooms.Rows
bla bla bla ' constat que la table n'a qu'une ligne... :(
Next
End If
End Sub
End Class

Quelqu'un pourrait-il m'aider ?

D'avance merci...

@+

LJ




Avatar
YJLAMOTTE
Bonjour et bon Lundi.. pff bientot les vacances.

Je crois que tu devrais mettre dans Datatable en session.

Ne pas la déclarer comme New Datatable mais juste Datatable et ne
l'instancier que lorsque tu en as besoin sois par un new soit par la
récupération de ta variable de session.

Protected WithEvents oDT_Rooms As New System.Data.DataTable

Private oDT_Rooms as DataTable (en faisant un Import de System.Data)


YJLAMOTTE

"Laurent Jordi (www.ezlogic.mc)" wrote:

Salut,

J'utilise une DataTable que je fabrique dynamiquement au chargement d'une
page.

Chaque fois que je clique sur un bouton sur la webform je voudrais ajouter
un élément dans cette table.

J'arrive bien à ajouter l'élément mais à chaque fois, je perd le contenu
précédent...

Voici ma déclaration :
(j'ai enlevé ce qui ne concernait pas la question)

Public Class Welcome
Inherits System.Web.UI.Page

#Region " Code généré par le Concepteur Web Form "

'Cet appel est requis par le Concepteur Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()

'**** Préparation de la datatable
Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))

End Sub

Protected WithEvents oDT_Rooms As New System.Data.DataTable

Voici le code du bouton

Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdAddRow.Click
Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
Dim szHTML As String
If cbxRooms.SelectedValue <> -1 Then
'**** Ajout de la ligne à la table en mémoire
Row("Code") = cbxRooms.SelectedValue
Row("txtNom") = cbxRooms.SelectedItem
Row("intPaxMax") = CLng(txtPers.Text)
Row("curPrix") = CSng(txtPrix.Text)
oDT_Rooms.Rows.Add(Row)
'**** Construction de la chaine HTML
For Each Row In oDT_Rooms.Rows
bla bla bla ' constat que la table n'a qu'une ligne... :(
Next
End If
End Sub
End Class

Quelqu'un pourrait-il m'aider ?

D'avance merci...

@+

LJ





Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut,

J'ai finalement stocké le contenu dans un textbox caché dont la chaine de
caractère est séparée par des ; et des |, un double split me permet de
reconstituer ma table...

Je pensais qu'en fonction de la façon de déclarer les variables dans la
page, on pourrait garder une sorte d'image de la page en mémoire jusqu'à
expiration de celle-ci. Mais je me suis trompé.

Quand aux variables de session, demain j'arrête... Donc je préfère éviter...

Toujours est-il que vous pouvez tester le résultat de ma méthode à l'adresse
http://www.hotelsurleweb.com , formulaire de réservation, en cliquant sur le
bouton + qui ajoute des chambres à la réservation...

Je pense qu'une solution qui pourrait être encore plus éfficace, serait de
créer une sorte de table XML temporaire.

Je ne veux pas stocker en base tant que l'utilisateur n'a pas confirmé sa
réservation (le bouton de confirmation n'est pas encore fait...)

@+

LJ


"YJLAMOTTE" a écrit dans le message de
news:
Bonjour et bon Lundi.. pff bientot les vacances.

Je crois que tu devrais mettre dans Datatable en session.

Ne pas la déclarer comme New Datatable mais juste Datatable et ne
l'instancier que lorsque tu en as besoin sois par un new soit par la
récupération de ta variable de session.

Protected WithEvents oDT_Rooms As New System.Data.DataTable

Private oDT_Rooms as DataTable (en faisant un Import de System.Data)


YJLAMOTTE

"Laurent Jordi (www.ezlogic.mc)" wrote:

> Salut,
>
> J'utilise une DataTable que je fabrique dynamiquement au chargement


d'une
> page.
>
> Chaque fois que je clique sur un bouton sur la webform je voudrais


ajouter
> un élément dans cette table.
>
> J'arrive bien à ajouter l'élément mais à chaque fois, je perd le contenu
> précédent...
>
> Voici ma déclaration :
> (j'ai enlevé ce qui ne concernait pas la question)
>
> Public Class Welcome
> Inherits System.Web.UI.Page
>
> #Region " Code généré par le Concepteur Web Form "
>
> 'Cet appel est requis par le Concepteur Web Form.
> <System.Diagnostics.DebuggerStepThrough()> Private Sub
> InitializeComponent()
>
> '**** Préparation de la datatable
> Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
> Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
> Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
> Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))
>
> End Sub
>
> Protected WithEvents oDT_Rooms As New System.Data.DataTable
>
> Voici le code du bouton
>
> Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
> System.EventArgs) Handles cmdAddRow.Click
> Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
> Dim szHTML As String
> If cbxRooms.SelectedValue <> -1 Then
> '**** Ajout de la ligne à la table en mémoire
> Row("Code") = cbxRooms.SelectedValue
> Row("txtNom") = cbxRooms.SelectedItem
> Row("intPaxMax") = CLng(txtPers.Text)
> Row("curPrix") = CSng(txtPrix.Text)
> oDT_Rooms.Rows.Add(Row)
> '**** Construction de la chaine HTML
> For Each Row In oDT_Rooms.Rows
> bla bla bla ' constat que la table n'a qu'une ligne... :(
> Next
> End If
> End Sub
> End Class
>
> Quelqu'un pourrait-il m'aider ?
>
> D'avance merci...
>
> @+
>
> LJ
>
>
>


Avatar
Pour le principe de ne pas stocker en base tant que l'utilisateur n'a pas
confirmé on peut faire un delete de la ligne sur l'événement session_end
dans global.asax si un flag dans la base ne dit pas que c confirmé
Sebastien
"Laurent Jordi (www.ezlogic.mc)" <inf[o]@ezlogic.mc> a écrit dans le message
de news:%
Salut,

J'ai finalement stocké le contenu dans un textbox caché dont la chaine de
caractère est séparée par des ; et des |, un double split me permet de
reconstituer ma table...

Je pensais qu'en fonction de la façon de déclarer les variables dans la
page, on pourrait garder une sorte d'image de la page en mémoire jusqu'à
expiration de celle-ci. Mais je me suis trompé.

Quand aux variables de session, demain j'arrête... Donc je préfère


éviter...

Toujours est-il que vous pouvez tester le résultat de ma méthode à


l'adresse
http://www.hotelsurleweb.com , formulaire de réservation, en cliquant sur


le
bouton + qui ajoute des chambres à la réservation...

Je pense qu'une solution qui pourrait être encore plus éfficace, serait de
créer une sorte de table XML temporaire.

Je ne veux pas stocker en base tant que l'utilisateur n'a pas confirmé sa
réservation (le bouton de confirmation n'est pas encore fait...)

@+

LJ


"YJLAMOTTE" a écrit dans le message


de
news:
> Bonjour et bon Lundi.. pff bientot les vacances.
>
> Je crois que tu devrais mettre dans Datatable en session.
>
> Ne pas la déclarer comme New Datatable mais juste Datatable et ne
> l'instancier que lorsque tu en as besoin sois par un new soit par la
> récupération de ta variable de session.
>
> Protected WithEvents oDT_Rooms As New System.Data.DataTable
>
> Private oDT_Rooms as DataTable (en faisant un Import de System.Data)
>
>
> YJLAMOTTE
>
> "Laurent Jordi (www.ezlogic.mc)" wrote:
>
> > Salut,
> >
> > J'utilise une DataTable que je fabrique dynamiquement au chargement
d'une
> > page.
> >
> > Chaque fois que je clique sur un bouton sur la webform je voudrais
ajouter
> > un élément dans cette table.
> >
> > J'arrive bien à ajouter l'élément mais à chaque fois, je perd le


contenu
> > précédent...
> >
> > Voici ma déclaration :
> > (j'ai enlevé ce qui ne concernait pas la question)
> >
> > Public Class Welcome
> > Inherits System.Web.UI.Page
> >
> > #Region " Code généré par le Concepteur Web Form "
> >
> > 'Cet appel est requis par le Concepteur Web Form.
> > <System.Diagnostics.DebuggerStepThrough()> Private Sub
> > InitializeComponent()
> >
> > '**** Préparation de la datatable
> > Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
> > Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
> > Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
> > Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))
> >
> > End Sub
> >
> > Protected WithEvents oDT_Rooms As New System.Data.DataTable
> >
> > Voici le code du bouton
> >
> > Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
> > System.EventArgs) Handles cmdAddRow.Click
> > Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
> > Dim szHTML As String
> > If cbxRooms.SelectedValue <> -1 Then
> > '**** Ajout de la ligne à la table en mémoire
> > Row("Code") = cbxRooms.SelectedValue
> > Row("txtNom") = cbxRooms.SelectedItem
> > Row("intPaxMax") = CLng(txtPers.Text)
> > Row("curPrix") = CSng(txtPrix.Text)
> > oDT_Rooms.Rows.Add(Row)
> > '**** Construction de la chaine HTML
> > For Each Row In oDT_Rooms.Rows
> > bla bla bla ' constat que la table n'a qu'une ligne... :(
> > Next
> > End If
> > End Sub
> > End Class
> >
> > Quelqu'un pourrait-il m'aider ?
> >
> > D'avance merci...
> >
> > @+
> >
> > LJ
> >
> >
> >




Avatar
YJLAMOTTE
Les variables de session sont beaucoup plus stable depuis IIS5 et je précise
que l'Etat de session peut etre stocké en base SQL ou via un process NT..
Bref ca marche bien.

YJLAMOTTE

"Laurent Jordi (www.ezlogic.mc)" wrote:

Salut,

J'ai finalement stocké le contenu dans un textbox caché dont la chaine de
caractère est séparée par des ; et des |, un double split me permet de
reconstituer ma table...

Je pensais qu'en fonction de la façon de déclarer les variables dans la
page, on pourrait garder une sorte d'image de la page en mémoire jusqu'à
expiration de celle-ci. Mais je me suis trompé.

Quand aux variables de session, demain j'arrête... Donc je préfère éviter...

Toujours est-il que vous pouvez tester le résultat de ma méthode à l'adresse
http://www.hotelsurleweb.com , formulaire de réservation, en cliquant sur le
bouton + qui ajoute des chambres à la réservation...

Je pense qu'une solution qui pourrait être encore plus éfficace, serait de
créer une sorte de table XML temporaire.

Je ne veux pas stocker en base tant que l'utilisateur n'a pas confirmé sa
réservation (le bouton de confirmation n'est pas encore fait...)

@+

LJ


"YJLAMOTTE" a écrit dans le message de
news:
> Bonjour et bon Lundi.. pff bientot les vacances.
>
> Je crois que tu devrais mettre dans Datatable en session.
>
> Ne pas la déclarer comme New Datatable mais juste Datatable et ne
> l'instancier que lorsque tu en as besoin sois par un new soit par la
> récupération de ta variable de session.
>
> Protected WithEvents oDT_Rooms As New System.Data.DataTable
>
> Private oDT_Rooms as DataTable (en faisant un Import de System.Data)
>
>
> YJLAMOTTE
>
> "Laurent Jordi (www.ezlogic.mc)" wrote:
>
> > Salut,
> >
> > J'utilise une DataTable que je fabrique dynamiquement au chargement
d'une
> > page.
> >
> > Chaque fois que je clique sur un bouton sur la webform je voudrais
ajouter
> > un élément dans cette table.
> >
> > J'arrive bien à ajouter l'élément mais à chaque fois, je perd le contenu
> > précédent...
> >
> > Voici ma déclaration :
> > (j'ai enlevé ce qui ne concernait pas la question)
> >
> > Public Class Welcome
> > Inherits System.Web.UI.Page
> >
> > #Region " Code généré par le Concepteur Web Form "
> >
> > 'Cet appel est requis par le Concepteur Web Form.
> > <System.Diagnostics.DebuggerStepThrough()> Private Sub
> > InitializeComponent()
> >
> > '**** Préparation de la datatable
> > Me.oDT_Rooms.Columns.Add("Code", GetType(Long))
> > Me.oDT_Rooms.Columns.Add("txtNom", GetType(String))
> > Me.oDT_Rooms.Columns.Add("intPaxMax", GetType(Long))
> > Me.oDT_Rooms.Columns.Add("CurPrix", GetType(Single))
> >
> > End Sub
> >
> > Protected WithEvents oDT_Rooms As New System.Data.DataTable
> >
> > Voici le code du bouton
> >
> > Private Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
> > System.EventArgs) Handles cmdAddRow.Click
> > Dim Row As System.Data.DataRow = oDT_Rooms.NewRow
> > Dim szHTML As String
> > If cbxRooms.SelectedValue <> -1 Then
> > '**** Ajout de la ligne à la table en mémoire
> > Row("Code") = cbxRooms.SelectedValue
> > Row("txtNom") = cbxRooms.SelectedItem
> > Row("intPaxMax") = CLng(txtPers.Text)
> > Row("curPrix") = CSng(txtPrix.Text)
> > oDT_Rooms.Rows.Add(Row)
> > '**** Construction de la chaine HTML
> > For Each Row In oDT_Rooms.Rows
> > bla bla bla ' constat que la table n'a qu'une ligne... :(
> > Next
> > End If
> > End Sub
> > End Class
> >
> > Quelqu'un pourrait-il m'aider ?
> >
> > D'avance merci...
> >
> > @+
> >
> > LJ
> >
> >
> >





Avatar
Renaud COMTE [MVP]
Des fois c'est tellement sympa de recoder la roue :D

Puis au pire , si les données se suffisent en texte ou dans une structure
simple, autant le charger en viewstate

Bref, .l'ASP.Net a bien des options, il ne faut pas avoir peur des les
utiliser (ou de les découvrir)

Voila

Renaud COMTE [MVP]
---------------------------------------------
http://www.clubSPS.org
http://blog.spsclerics.com/
---------------------------------------------
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut...

Je ne savais pas que tu étais MVP...

Félicitations

@+

LJ
"Renaud COMTE [MVP]" a écrit dans le
message de news:
Des fois c'est tellement sympa de recoder la roue :D

Puis au pire , si les données se suffisent en texte ou dans une structure
simple, autant le charger en viewstate

Bref, .l'ASP.Net a bien des options, il ne faut pas avoir peur des les
utiliser (ou de les découvrir)

Voila

Renaud COMTE [MVP]
---------------------------------------------
http://www.clubSPS.org
http://blog.spsclerics.com/
---------------------------------------------




Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut

Sans vouloir t'offencer cher Renaud, je trouve que le viewstate est parfois
très lourd. En l'occurence c'est exactement ce que je fait puisque je sauve
le contenu de mon tableau dans un champ texte.

Les types ne sont pas très important puisque je garde les codes
enregistrement... Je ne conserve les textes que pour information...

@+

LJ


"Renaud COMTE [MVP]" a écrit dans le
message de news:
Des fois c'est tellement sympa de recoder la roue :D

Puis au pire , si les données se suffisent en texte ou dans une structure
simple, autant le charger en viewstate

Bref, .l'ASP.Net a bien des options, il ne faut pas avoir peur des les
utiliser (ou de les découvrir)

Voila

Renaud COMTE [MVP]
---------------------------------------------
http://www.clubSPS.org
http://blog.spsclerics.com/
---------------------------------------------




Avatar
Renaud COMTE [MVP]
Merci

A vrai dire, je poste plus sur "microsoft.public.fr.sharepoint" et des fois
, je passe ici ;)

Renaud COMTE [MVP]
---------------------------------------------
http://www.clubSPS.org
http://blog.spsclerics.com/
---------------------------------------------
Avatar
Renaud COMTE [MVP]
Je suis pas offenser, il en faut bien plus ....

Je dis juste que le viewstate est une tres bon outil quand on veux juste
conserver des valeurs dans la vie d'une page. Ca evite d'utiliser une
session mais ca penalise le poid de la page

C'est tout une question de taille

Par contre, question lourdeur....
je pense que tu veux parler du volume. il est peut etre facilement






reduis a condition de bien autoriser les viewstate seulement sur les
controles necessaires. une fois bien configuré , la page s'allege comme par
magie, mais ca demande de la manip

Sinon, que tu le place en viewstate ou dans un textbox, la taille sera la
meme vue que le viewstat n'est qu'un encodage d'une collection de valeur en
string donc ...... ca changerasz franchement pas grand chose (sauf si tu a
deja interdis le viewstate de ta page, dans le cas contraire , c'est kif
kif )

Voila

Renaud COMTE [MVP]
---------------------------------------------
http://www.clubSPS.org
http://blog.spsclerics.com/
---------------------------------------------
[INFO] : Je me permet de rappeller l'importance de bien préciser la version
de SPS dans vos questions
cela eviterais des réponses erronées ou trompeuses comme récemment sur






la problématique de backup
Ca autoriserais aussi des tris plus efficaces via le moteur de recherche







Donc je vous propose donc de préfixer les posts via [SPS 2003] [SPS 2001]
[WSS]
"Laurent Jordi (www.ezlogic.mc)" <inf[o]@ezlogic.mc> a écrit dans le message
de news:
Salut

Sans vouloir t'offencer cher Renaud, je trouve que le viewstate est


parfois
très lourd. En l'occurence c'est exactement ce que je fait puisque je


sauve
le contenu de mon tableau dans un champ texte.

Les types ne sont pas très important puisque je garde les codes
enregistrement... Je ne conserve les textes que pour information...

@+

LJ


"Renaud COMTE [MVP]" a écrit dans le
message de news:
> Des fois c'est tellement sympa de recoder la roue :D
>
> Puis au pire , si les données se suffisent en texte ou dans une


structure
> simple, autant le charger en viewstate
>
> Bref, .l'ASP.Net a bien des options, il ne faut pas avoir peur des les
> utiliser (ou de les découvrir)
>
> Voila
>
> Renaud COMTE [MVP]
> ---------------------------------------------
> http://www.clubSPS.org
> http://blog.spsclerics.com/
> ---------------------------------------------
>
>




1 2