Bonjour à tous,
J'affiche dans un formulaire une DataGrid liée à une série de données qui peut être modifiée par l'utilisateur. Suite à ses modifications, l'utilisateur peut valider ou non le formulaire. Lors de la non validation du formulaire (= fermeture sans enregistrement) je pensais retrouver les données telles qu'elles étaient lors de l'ouverture du formulaire... MAIS je constate que toute modification d'une valeur dans la DataGrid est systématiquement reportée dans la source de celle-ci !
J'ai écrit un tout petit exemple pour mieux vous montrer :
> Objet affiché dans la DataGrid :
Code vb.net : 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 Imports System Imports System.Collections.Generic Imports System.Windows Imports System.ComponentModel Namespace ESSAI Public Class Variable Inherits DependencyObject '**************************************************************** 'Déclaration des variables '**************************************************************** Private _nom As String Private _valeur As String '**************************************************************** ' Propriétés '**************************************************************** #Region "CLR-PROPERTIES" '**************************************************************** ' Propriété nom '**************************************************************** ''' <summary> ''' Propriété nom de la classe Variable ''' </summary> ''' <returns> ''' Indique le nom de la variable ''' </returns> ''' <remarks></remarks> Public Property nom() As String Get Return _nom End Get Set(value As String) _nom = value End Set End Property '**************************************************************** ' Propriété valeur '**************************************************************** ''' <summary> ''' Propriété valeur de la classe Variable ''' </summary> ''' <returns> ''' Indique la valeur de la variable ''' </returns> ''' <remarks></remarks> Public Property valeur() As String Get Return _valeur End Get Set(value As String) _valeur = value End Set End Property #End Region Public Sub New() End Sub End Class End namespace
> Formulaire avec DataGrid :
Code xaml : 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 <Window x:Class="ESSAI.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="TEST" Title="Debug_DataGrid" Height="300" Width="300"> <StackPanel Orientation="Vertical"> <DataGrid Name="_myDataGrid" ItemsSource="{Binding Path=TEST.aList, Mode=OneWay}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Name" Binding="{Binding Path=nom}" /> </DataGrid.Columns> </DataGrid> <Button Content="TEST" Click="Button_Click" /> </StackPanel> </Window>
> Code du formulaire :
Code vb.net : 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel Imports System.Text Imports System.Windows Imports System.Windows.Controls Imports System.Windows.Data Imports System.Windows.Documents Imports System.Windows.Input Imports System.Windows.Media Namespace ESSAI Public Partial Class Window1 Inherits Window Private aList As ObservableCollection(Of Variable) = New ObservableCollection(Of Variable) Private myList As ObservableCollection(Of Variable) = New ObservableCollection(Of Variable) Public Sub New() InitializeComponent() Dim aVariable As Variable aVariable = New Variable aVariable.nom = "VAR1" aVariable.valeur = "1" aList.Add(aVariable) aVariable = New Variable aVariable.nom = "VAR2" aVariable.valeur = "2" aList.Add(aVariable) aVariable = New Variable aVariable.nom = "VAR3" aVariable.valeur = "3" aList.Add(aVariable) _myDataGrid.ItemsSource = aList myList = New ObservableCollection(Of Variable)(aList) End Sub Sub Button_Click(sender As Object, e As RoutedEventArgs) For i As Integer = 0 To _myDataGrid.Items.Count - 2 Dim aVar As Variable = New Variable aVar = DirectCast(_myDataGrid.Items(i), Variable) System.Diagnostics.Debug.WriteLine("A - LIGNE : " & aVar.nom.ToString) Next System.Diagnostics.Debug.WriteLine("----------------------") For i As Integer = 0 To myList.Count - 1 Dim aVar As Variable = New Variable aVar = myList(i) System.Diagnostics.Debug.WriteLine("B - LIGNE : " & aVar.nom.ToString) Next System.Diagnostics.Debug.WriteLine("----------------------") For i As Integer = 0 To Me.aList.Count - 1 Dim aVar As Variable = New Variable aVar = Me.aList(i) System.Diagnostics.Debug.WriteLine("C - LIGNE : " & aVar.nom.ToString) Next End Sub End Class End Namespace
En modifiant le nom de l'une des 3 variables et en cliquant sur le bouton "TEST", vous pourrez constater (dans la fenêtre de sortie de votre éditeur) que la DataGrid, la source de celle-ci (aList) et une copie de la source elle-même (myList) font toutes les 3 apparaître la modification... Comment conserver la source originale (ou une copie) ?? Je suis certainement passé à coté de quelque chose mais impossible de voir quoi ! C'est en train de me rendre dingue ce truc...
Merci à tous ceux qui auraient une réponse ou une idée !
EyeRobot
Partager