IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

DataGrid, problème récupération données


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut DataGrid, problème récupération données
    Bonjour,

    Je me trouve face à un bug étonnant.

    Dans ma vu j'ai une 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
    <DataGrid Grid.Row="1" Grid.Column="1" Grid.RowSpan="1" Grid.ColumnSpan="1" 
                              Margin="5,0,10,0"
                              AutoGenerateColumns="False" 
                              AlternatingRowBackground="LightGray" 
                              CanUserResizeColumns="False"
                              CanUserResizeRows="False"
                              CanUserAddRows="True" 
                              ItemsSource="{Binding DataGridSource}" 
                              SelectedItem="{Binding SelectedItem, Converter={StaticResource ResourceKey=ConverterKey}}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="40" Header="IDetape" Binding="{Binding IDEtape}" />
                            <DataGridTextColumn Width="40" Header="IDrecipe" Binding="{Binding IDRecipe}" />
                            <DataGridTextColumn Width="40" Header="Etape" Binding="{Binding EtapeOrdre}" />
                            <DataGridTextColumn Width="*" Header="Description" Binding="{Binding EtapeDescription}" />
                        </DataGrid.Columns>
                    </DataGrid>

    Dans ma Vue-Modèle j'ai défini les propriétés et méthodes suivantes :
    Code : 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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #region  <!------------------------ PROPRIETES PARTIE DROITE .XAML -------------------------->
            private ObservableCollection<RecipeEtape> _dataGridSource;
            public ObservableCollection<RecipeEtape> DataGridSource
            {
                get
                {
                    return _dataGridSource;
                }
                set
                {
                    _dataGridSource = value;
                    OnPropertyChanged("DataGridSource");
                }
            }
     
            private RecipeEtape _selectedItem;
            public RecipeEtape SelectedItem
            {
                get
                {
                    return _selectedItem;
                }
                set
                {
                    _selectedItem = value;
                    OnPropertyChanged("SelectedItem");
                }
            }
            #endregion  <!------------------------ PROPRIETES PARTIE DROITE .XAML -------------------------->
     
    #region  <!------------------------ PRIVATE METHOD PARTIE DROITE .XAML -------------------------->
    private void loadData_DataGrid()
            {
                foreach (var item in RecipeEtapeProvider.selectAll(_listViewRecetteSelectedItem.Name))
                {
                    _dataGridSource.Add(new RecipeEtape
                    {
                        IDEtape = item.IDEtape,
                        IDRecipe = item.IDRecipe,
                        EtapeOrdre = item.EtapeOrdre,
                        EtapeDescription = item.EtapeDescription,
                    });
                }
                subscribeEvent();
                _dataGridSource.CollectionChanged += DataGridSource_CollectionChanged;
            }
            private void subscribeEvent()
            {
                foreach (RecipeEtape obj in _dataGridSource)
                {
                    obj.PropertyChanged += onPropertyChanged;
                }
            }
     
            private void onPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                if (_selectedItem.IDEtape != null)
                {
                    RecipeEtape obj = new RecipeEtape()
                    {
                        IDEtape = _selectedItem.IDEtape,
                        IDRecipe = _listViewRecetteSelectedItem.Name,
                        EtapeOrdre = _selectedItem.EtapeOrdre,
                        EtapeDescription = _selectedItem.EtapeDescription,
                    };
                    RecipeEtapeProvider.updateItem(obj);
                }
                else
                {
                    RecipeEtape obj = new RecipeEtape()
                    {
                        // IDEtape = "",  Incrément auto fait par DB - TODO : Faire soi-même l'AI
                        IDRecipe = _listViewRecetteSelectedItem.Name,
                        EtapeOrdre = _selectedItem.EtapeOrdre,
                        EtapeDescription = _selectedItem.EtapeDescription,
                    };
                    //RecipeEtapeProvider.addItem(obj);
                    _selectedItem.IDEtape = (int.Parse(RecipeEtapeProvider.selectLastID()) + 1).ToString();
                }
            }
     
    private void DataGridSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
            {
                RecipeEtape obj;
                switch (e.Action)
                {
                    case NotifyCollectionChangedAction.Add:
                        obj = (RecipeEtape)e.NewItems[0];
                        if (obj.IDEtape == null)
                        {
                            obj.PropertyChanged += onPropertyChanged;
                        }
                        break;
     
                    case NotifyCollectionChangedAction.Remove:
                        obj = (RecipeEtape)e.OldItems[0];
                        if (e.OldItems != null)
                        {
                            obj.PropertyChanged -= onPropertyChanged;
                            deleteItem(e.OldItems.Cast<object>().ToList());
                        }
                        break;
     
                    default:
                        break;
                }
            }
    #endregion  <!------------------------ PRIVATE METHOD PARTIE DROITE .XAML -------------------------->
    Enfin mon Modèle est défini comme tel :
    Code : 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
    public class RecipeEtape : ViewModelBase
        {
            #region Variable
            private string _idEtape;
            private string _idRecipe;
            private string _etapeOrdre;
            private string _etapeDescription;
            #endregion Variable
     
            #region Constructor
            #endregion Constructor
     
            #region Properties
            public string IDEtape
            {
                get
                {
                    return _idEtape;
                }
                set
                {
                    _idEtape = value;
                    OnPropertyChanged("IDEtape");
                }
            }
     
            public string IDRecipe
            {
                get
                {
                    return _idRecipe;
                }
                set
                {
                    _idRecipe = value;
                    OnPropertyChanged("IDRecipe");
                }
            }
     
            public string EtapeOrdre
            {
                get
                {
                    return _etapeOrdre;
                }
                set
                {
                    _etapeOrdre = value;
                    OnPropertyChanged("EtapeOrdre");
                }
            }
     
            public string EtapeDescription
            {
                get
                {
                    return _etapeDescription;
                }
                set
                {
                    _etapeDescription = value;
                    OnPropertyChanged("EtapeDescription");
                }
            }
            #endregion Properties
     
        }
    Lorsque je mets à jour des données du datagrid, j'arrive bien à mettre à jour ma DB.

    Par contre, lorsque je souhaite ajouter une nouvelle ligne, la fonction "onPropertyChanged" est bien utilisée, puis le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RecipeEtape obj = new RecipeEtape()
                    {
                        // IDEtape = "",  Incrément auto fait par DB - TODO : Faire soi-même l'AI
                        IDRecipe = _listViewRecetteSelectedItem.Name,
                        EtapeOrdre = _selectedItem.EtapeOrdre,
                        EtapeDescription = _selectedItem.EtapeDescription,
                    };
    est bien exécuté.

    Cependant, et d'une façon que je n'explique pas ni ne comprends, "_selectedItem.EtapeOrdre" retourne "null" alors que "_selectedItem.EtapeDescription" retourne bien la valeur saisie.

    Auriez-vous une idée de ce qui peut clocher ?

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut
    Après plusieurs recompilation le script ci-dessus fonctionne bien.
    Le bug a disparu..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2009, 10h37
  2. Réponses: 2
    Dernier message: 11/12/2008, 03h34
  3. Problème récupération données d'un tableau
    Par DragonicFlash dans le forum Langage
    Réponses: 2
    Dernier message: 03/12/2008, 11h43
  4. Problème récupération données struts/hibernate
    Par Syham dans le forum Struts 1
    Réponses: 9
    Dernier message: 12/03/2008, 10h48
  5. [MySQL] Problème récupération données avec apostrophe
    Par Nata31 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 21/07/2006, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo