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

Windows Presentation Foundation Discussion :

Ajout/Modification de colonnes d'une DataGrid [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Femme Profil pro
    Apprentie
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprentie

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Ajout/Modification de colonnes d'une DataGrid
    Bonjour à tous,

    pour vous replacer dans le contexte :
    je débute en WPF et je dois adapter une application de Windows Form à WPF. Le projet en WF comportait une DataGridView, j'ai donc ajouté une DataGrid en WPF.

    En ce qui concerne l'ajout simple de donnée au DataGrid, tout va bien, voilà le code utilisé qui marche très bien (si vous avez fait des recherches sur le net : oui je l'ai piqué!) :

    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
    public ObservableCollection<GameData> test { get; set; }
     
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
                AjoutLst();
            }
     
            private void AjoutLst()
          {
                test = new ObservableCollection<GameData>();
     
                GameData gameOne = new GameData("Overwatch", "Blizzard", "Blizzard");
                test.Add(new GameData("Heroes of the Storm", "Blizzard", "Blizzard"));
                test.Add(new GameData("Starcraft", "Blizzard", "Blizzard"));
                test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
                test.Add(gameOne);      
            }
        }
     
        public class GameData
        {
            private string _gamename;
            private string _creator;
            private string _publisher;
     
            public GameData(string gn, string cr, string pu)
            {
                _gamename = gn;
                _creator = cr;
                _publisher = pu;
            }
     
            public string GameName
            {
                get { return _gamename; }
                set { _gamename = value; }
            }
            public string Creator
            {
                get { return _creator; }
                set { _creator = value; }
            }
            public string Publisher
            {
                get { return _publisher; }
                set { _publisher = value; }
            }
        }
    }

    Maintenant, je voudrais ajouter(ou modifier) une colonne.
    Les valeurs de cette nouvelle colonne viennent d'un tableau de donnée que je peux changer/importer. J'essaie donc d'utiliser une seconde List ObservableCollection, plus facile à manipuler puisqu'il n'y a qu'à clear et rajouter toutes les données à l'aide d'une boucle for.
    Au niveau XAML, je créer une nouvelle colonne et bind celle-ci. Mais les valeurs ne s'affichent pas!
    Je suppose qu'il faudrait que cette nouvelle collection soit ajoutée en item, voir ItemSource, mais étant donné qu'il y a déjà "test" en ItemSource, pas possible, donc ça ne marche pas.. D'ailleurs, lorsque j'ai testé un Item.add, j'ai une erreur..

    Voilà le code xaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            <DataGrid x:Name="dataGrid" Margin="161,66,118,68.8" AutoGenerateColumns="False" ItemsSource="{Binding test}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Game Name" Binding="{Binding GameName}"/>
                    <DataGridTextColumn Header="Creator" Binding="{Binding Creator}"/>
                    <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}" />
                    <DataGridTextColumn Header="Param" Binding="{Binding Value}" />
                </DataGrid.Columns>
            </DataGrid>
    Et voilà le code C# :
    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
    public partial class MainWindow : Window
        {
            public ObservableCollection<GameData> test { get; set; }
            public ObservableCollection<Param> paramRecu { get; set; }
            string str_tst = "test";
     
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;
                AjoutLst();
            }
     
            private void AjoutLst()
          {
                test = new ObservableCollection<GameData>();
                paramRecu = new ObservableCollection<Param>();
                GameData gameOne = new GameData("Overwatch", "Blizzard", "Blizzard");
                test.Add(new GameData("Heroes of the Storm", "Blizzard", "Blizzard"));
                test.Add(new GameData("Starcraft", "Blizzard", "Blizzard"));
                test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
                test.Add(gameOne);
     
                for (int i = 0; i <= 3; i++)
                {
                    paramRecu.Add(new Param(str_tst[i]+""));
                }         
            }
        }
     
        public class Param
        {
            string _value;
     
            public Param(string value)
            {
                _value = value;
            }
            public string Value
            {
                get { return _value; }
                set { _value = value; }
            }
        }
        public class GameData
        {
            private string _gamename;
            private string _creator;
            private string _publisher;
     
            public GameData(string gn, string cr, string pu)
            {
                _gamename = gn;
                _creator = cr;
                _publisher = pu;
            }
            public string GameName
            {
                get { return _gamename; }
                set { _gamename = value; }
            }
            public string Creator
            {
                get { return _creator; }
                set { _creator = value; }
            }
            public string Publisher
            {
                get { return _publisher; }
                set { _publisher = value; }
            }
        }
    Existe-t-il une façon plus simple?
    Vous voyez où est-ce que je me trompe?

    Je remercie d'avance ceux qui se penchent sur mon problème!

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Quel est le lien entre un gameData et un paramètre?
    Actuellement je n'en vois aucun dans ton code, pourquoi donc vouloir les afficher sur une même ligne?
    En plus comment tu souhaites afficher les paramètres?

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Il faudrait voir du coté de CompositeCollection ,qui fera peut être ton bonheur...

  4. #4
    Membre à l'essai
    Femme Profil pro
    Apprentie
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprentie

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci à vous deux,

    Pour répondre à Micka : en fait c'était pour inclure des descriptions dans différentes langues, EN, FR,... Il y a un rapport entre les deux, mais toutes les valeurs de la colonne "param" changaient suivant la langue. Je pensais donc qu'il valait mieux créer des list de paramètres dans toutes les langues différentes puis les ajouter en fonction de la langue choisie.

    Mais en fait c'était chercher compliqué pour rien :
    il suffit soit de modifier les valeurs des colonnes avec un for (int i = 0; MyObservableCollection.Count -1;i++), soit on peut créer des colonnes que l'on remplit de valeurs puis on joue sur la visibilité avec [I]MyDataGrid.Columns.Visibility = visibility.hidden; pour choisir quelle colonne afficher. (Oui, c'est un peu tricher... Mais ça marche!)


    Au niveau du code, j'ai simplement ajouté dans la class GameData :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public string _parametre
    public string Parametre
            {
                get { return _parametre; }
                set { _parametre = value; }
            }
    (avec modification du constructeur en conséquence)

    Pour remplir la DataGrid :
    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
            private void AjoutLst()
          {
                test = new ObservableCollection<GameData>();
                GameData gameOne = new GameData("Overwatch", "Blizzard", "Blizzard","");
                test.Add(new GameData("Heroes of the Storm", "Blizzard", "Blizzard",""));
                test.Add(new GameData("Starcraft", "Blizzard", "Blizzard",""));
                test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard",""));
                test.Add(gameOne);
     
               for(int i = 0; i <= test.Count-1;i++)
                {
                    test[i].Parametre = str_tst[i]+"";
                }
     
            }
    Et en xaml on ajoute et bind la nouvelle colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DataGridTextColumn Header="Param" Binding="{Binding Parametre}" />

    J'ai trouvé cette solution avant de voir le message de Mabrouki. CompositeCollection me semble très intéressante, malheureusement pas d'exemple sur la page MSDN de la classe! Je m'y intéresserais de plus près lorsque j'aurais plus d'expérience et d'aisance pour améliorer le code...

    Encore merci à vous!

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

Discussions similaires

  1. Rajouter une colonne dans une datagrid
    Par bejaad dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/08/2007, 10h32
  2. Ajout de deux colonnes lorsqu'une des deux est à null
    Par KibitO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/09/2006, 14h07
  3. Modification nom colonne dans une table
    Par Mvu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/06/2006, 10h38
  4. [c#]Modifer la valeur d'une DataGrid
    Par guillaume16 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/05/2006, 16h21
  5. [C#] Cacher une colonne d'une dataGrid
    Par royrremi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/05/2004, 16h00

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