OVH Cloud OVH Cloud

variable globale

14 réponses
Avatar
pierre
hum hum,
j'ai posé une question il y a 2 jours pour savoir comment avoir un dataset
commun à 2 forms**.
Le pb, C'est que je n'ai pas de dataadapter puisque je remplie mon dataset
par un fichier XML.
Un truc (entre autre:-)) que je ne comprends pas: il n'es pas possible
d'avoir une variable glogale dans mon projet?
Je la créé ds un formulaire, je l'instancie avec new, je l'utilise et mon
2eme formulaire l'utilise?
Ds ces cas la, pourquoi ne pas mettre mon dataset en variable globale?
pffff. Je vais bientot commencer à pleurer...

Merci à ceux qui peuvent me repondre.


**pour l'instant, je palie à ca en ecrivant le fichier XML apres les maj et
en le chargeant à l'ouverture du 2eme formulaire.
Ca marche pas mal mais j'ai impression d'eclater les mouches à la dynamite!

10 réponses

1 2
Avatar
Patrick Philippot
pierre wrote:
j'ai posé une question il y a 2 jours pour savoir comment avoir un
dataset commun à 2 forms**.
Le pb, C'est que je n'ai pas de dataadapter puisque je remplie mon
dataset par un fichier XML.
Un truc (entre autre:-)) que je ne comprends pas: il n'es pas
possible d'avoir une variable glogale dans mon projet?
Je la créé ds un formulaire, je l'instancie avec new, je l'utilise et
mon 2eme formulaire l'utilise?



Bonjour,

En .Net, vous faites de l'objet et vous oubliez donc définitivement la
notion de variable ou de méthode globales. par contre regardez la
documentation à propos des Membres Partagés (Shared Members), c'est ce
qui fait fonction de variable / méthodes globales quand c'est nécessaire
(ce n'est toutefois pas tout à fait la même chose).

Ceci étant posé, supposons que Form2 est créée par Form1. Il vous suffit
de créer pour Form2 un constructeur (New) spécifique qui accepte en
argument la référence à un Dataset. Le constructeur stocke ensuite cette
référence dans une variable privée de Form2 et les méthodes de Form2
utilisent cette référence quand c'est nécessaire.

Dans Form1

MaFrm2 = New Form2(MonDataSet)

Dans Form2

Private m_ds As Dataset

Public Sub New( ds As DataSet)
MyClass.New() ' appelle le constructeur par défaut
m_ds = ds
End Sub

Référencez ensuite m_ds quand vous en avez besoin.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Gasp!

J'ai donné un exemple en VB .Net (désolé, je suis multithread en ce
moment) mais le raisonnement s'applique quand même.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
En .Net, vous faites de l'objet et vous oubliez donc définitivement la
notion de variable ou de méthode globales. par contre regardez la
documentation à propos des Membres Partagés (Shared Members),



Quand je dis Shared en VB, je dis static en C#. Désolé.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
pierre
Merci beaucoup Patrick.
je teste ca tout de suite.
Pierre




"Patrick Philippot" wrote:

Gasp!

J'ai donné un exemple en VB .Net (désolé, je suis multithread en ce
moment) mais le raisonnement s'applique quand même.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr





Avatar
Zoury
Salut Pierre! :O)

Ds ces cas la, pourquoi ne pas mettre mon dataset en variable globale?
pffff. Je vais bientot commencer à pleurer...



Les variables globales ne respete pas le concept OO et reste en mémoire tout
le long du processus ce qui n'est pas toujours souhaitable...


Voici une bonne pratique de programmation à appliquer dans un cas semblable.
'***
' Form1
Option Explicit On

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1
Inherits System.Windows.Forms.Form

Private _ds As DataSet

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

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(120, 112)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load

InitDataSource()
Button1.Text = "Form2"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim dr As DataRow

If (EditDataSource(_ds)) Then
Console.WriteLine("le dataset à été modifié. Il contient
maintenant {0} ligne(s)", _ds.Tables(0).Rows.Count)
End If

End Sub

Private Sub InitDataSource()

Dim dt As DataTable = New DataTable("MaTable")
dt.Columns.Add("ID", GetType(Int32))
dt.Columns.Add("Prenom", GetType(String))

_ds = New DataSet
_ds.Tables.Add(dt)

End Sub

Private Function EditDataSource(ByRef ds As DataSet) As Boolean

Dim frm As Form2
Dim bRet As Boolean

' on passe le dataset en entrée.. note qu'on
' aurait pu le faire en mode "constructeur" (New Form2(_ds))
frm = New Form2
frm.DataSource = ds
frm.ShowDialog(Me)
If (frm.DialogResult = DialogResult.OK) Then
' des modifs ont été effectués, on peut
' donc réaffecté notre DataSet..
'ds = frm.DataSource
bRet = True
End If
frm.Close()

Return bRet

End Function

End Class
'***
' Form2
Option Explicit On

Imports System.Data
Imports System.Data.SqlClient

Public Class Form2
Inherits System.Windows.Forms.Form

Private _ds As DataSet

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

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.Button2 = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'Button1
'
Me.Button1.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Button1.Location = New System.Drawing.Point(128, 112)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(88, 24)
Me.Button1.TabIndex = 0
Me.Button1.Text = "&Ok"
'
'Button2
'
Me.Button2.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Button2.Location = New System.Drawing.Point(32, 112)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(80, 24)
Me.Button2.TabIndex = 1
Me.Button2.Text = "&Annuler"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 40)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(216, 48)
Me.Label1.TabIndex = 2
Me.Label1.Text = "Lors de l'ouverture de page, le dataset à été
modifié. Appuyer sur Ok si vous sou" & _
"haitez conserver ces changements."
'
'Form2
'
Me.AcceptButton = Me.Button1
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.CancelButton = Me.Button2
Me.ClientSize = New System.Drawing.Size(240, 158)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.Button1)
Me.Name = "Form2"
Me.Text = "Form2"
Me.ResumeLayout(False)

End Sub

#End Region

' Permet d'échanger le DataSet avec les autres objets
Public Property DataSource() As DataSet
Get
Return _ds
End Get
Set(ByVal Value As DataSet)
_ds = Value
End Set
End Property

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' ici on modifie le dataset pour le test..
' on aurait pu le branché à une DataGrid
' et laissé l'utilisateur faire les modifs
ChangeDataSource()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
_ds.AcceptChanges()
Me.Hide()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
_ds.RejectChanges()
Me.Hide()
End Sub

Private Sub ChangeDataSource()
Dim dt As DataTable
If ((Not _ds Is Nothing) AndAlso (_ds.Tables.Count > 0) AndAlso
(_ds.Tables(0).Columns.Count = 2)) Then
dt = _ds.Tables(0)
dt.Rows.Add(New Object() {1, "yan"})
dt.Rows.Add(New Object() {2, "nick"})
dt.Rows.Add(New Object() {3, "pat"})
dt.Rows.Add(New Object() {4, "mario"})
End If
End Sub

End Class
'***


Note que dans le formulaire Form2, j'ai dû modifier les propriétés suivantes
afin de bien détecter l'action qui a été fait par l'utilisateur :

Button1.DialogResult = DialogResult.OK
Button2.DialogResult = DialogResult.Cancel
Me.AcceptButton = Me.Button1
Me.CancelButton = Me.Button2

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Zoury
Naaaaaaaaaaaaaaaaarrrggg!!! mauvais langage.
tu sais lire le code VB ou tu veux que je le traduise.. ? :O/

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Patrick Philippot
Zoury wrote:
Naaaaaaaaaaaaaaaaarrrggg!!! mauvais langage.



:-)))) Même chose. Il y a des moments, je ne sais plus où je suis...

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Zoury wrote:
Naaaaaaaaaaaaaaaaarrrggg!!! mauvais langage.



:-)))) Même chose. Il y a des moments, je ne sais plus où je suis...

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Zoury
ça vient très mêlant en effet.. je devrais renommer les comptes dans OE..
:O)

--
Cordialement
Yanick
MVP pour Visual Basic
"Patrick Philippot" a écrit dans le
message de news:eztWlmx$
Zoury wrote:
> Naaaaaaaaaaaaaaaaarrrggg!!! mauvais langage.

:-)))) Même chose. Il y a des moments, je ne sais plus où je suis...

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr





Avatar
pierre
Et bien tout d'abord, je vous remercie beaucoup tout les deux.

Ca n'est pas grave que vos sources soient en VB, je les comprends quand meme.
Pour le passage de mon DataSet (ds) d'un form à l'autre, j'ai testé avec
succes le passage en parametre.
Ce dont je me rend compte, c'est qu'il faut que je change radicalement ma
facon de penser. Je connais les concepts objets mais ils ne sont pas naturel
pour moi. je suis "déformé" par mes apprentissages précédents (VB, VBA).
je vais faire encore des testes pour faire que mon ds soit vraiment
"partagé" plus que "passé" . (avec shared). Il faut aussi que je modifie mon
code pour que utiliser un ds typé plutot que non et puis plein d'autres trucs.
Je fais un programme tout con mais j'utilise plein de trucs nouveaux pour
moi pour apprendre. Je n'aurai jamais pensé que j'aurais autant de mal! Je
galère sur tout, mais ca va rentrer!
Encore une fois, merci (mais je pense que vous me retrouverez avec mes
questions sur le Newsgroup).

pierre



"Zoury" wrote:

ça vient très mêlant en effet.. je devrais renommer les comptes dans OE..
:O)

--
Cordialement
Yanick
MVP pour Visual Basic
"Patrick Philippot" a écrit dans le
message de news:eztWlmx$
> Zoury wrote:
> > Naaaaaaaaaaaaaaaaarrrggg!!! mauvais langage.
>
> :-)))) Même chose. Il y a des moments, je ne sais plus où je suis...
>
> --
> Patrick Philippot - Microsoft MVP
> MainSoft Consulting Services
> www.mainsoft.fr
>
>
>





1 2