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 :

GridView et GridViewColumn: comment mémoriser la position des colonnes?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut GridView et GridViewColumn: comment mémoriser la position des colonnes?
    Bonjour à tous,

    Je rencontre actuellement une difficulté.
    J'ai une GridView sur laquelle je peux changer la position des colonnes grâce à la propriété AllowsColumnReorder positionnée à TRUE.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <GridView AllowsColumnReorder="true">
    	<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Lastname}" />
    	<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Firstname}" />
    	<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Age}" />
    </GridView>

    Le problème c'est que quand je ferme l'application, je perds l'ordre de mes colonnes (ce qui tout à fait normal). Je voudrais savoir comment obtenir l'ordre actuel de mes colonnes à un instant T et comment je pourrais faire pour le réassigner par la suite.

    Je en trouve pas d'infos.
    Par avance merci.

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Tu as une propriété Columns sur l'objet GridView. La question que je me pose, c'est est-ce qu'elle contient les colonnes de façon ordonnées...
    Peut-être que tu peux regarder ce point .

    Si c'est ordonné, à la fermeture de l'application, tu peux regarder ce que vaut cette propriété et sauvegarder les colonnes dans un fichier de settings propre à l'utilisateur/machine.

  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 takinelinfo
    Comme l'as dit Binoo ,la propriete Columns du GridView retourne une liste de GridViewColumn .Un GridVieCoumn possede 2 props correlees savoir :
    - Header :celle qui t'interesse en l'occurence
    - DisplayMemberPath : le chemin de la prop correspondante.Via le chemin on peut retrouver le nom de prop.
    Car GridViewColumn pour etre reconstitue exige les 2 prop sous forme de string.
    Comme sauver cette cohorte de "paire" de prop de chaque GridViewColumn dans parametres d'application type User?
    Eh bien on cree notre propre classe ColSettings(attribut de portee User) heritee de SettingsBase avec 2 prop :
    -EtatInitial :bool pour initialiser les parametres
    -lstCols: liste des colonnes de type MapCol
    MapCol est un class perso qui "mappe" nos 2 cheres propdu GridViewCoumn.

    Apres il suffit :
    1/etat initial d'application :
    - initialiser nos parametres avec les prop de chaque GridViewCoumn de notre GridView tel qu'il est charge la 1ere fois dans notre xaml ( default EtatInitial=True dans notre classe ColSettings) et changer EtatInitial=false.
    -changer EtatInitial=false et Sauvegarder ces preferences dans ColSettings.

    2/event Loaded du form:
    -lire la liste à partir de ColSettings et la mettre dans chaque GridViewCoumn de notre GridView.
    -de plus il faut binder la prop "view" du ListView à notre GridView,car la vue du ListView est obtenue à partir du GridView reconstitue (en fait de sa liste de colonnes)....

    3/event Closing (et pas Close) du form:
    - storer les prop colonnes du GridViewColonnes dans liste de ColSettings ....

    Voici exemple code:
    code behind de la classe de donnee utilisee "emplacement(localite)" :
    Code c# : 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
     
    //classe de donnees exemple
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
     
    namespace WpfIndexGridViewCS
    {
        public class Emplacement
        {
            public string CityName { get; set; }
            public string State { get; set; }
            public int Population { get; set; }
            public SpecialFeatures SpecialFeatures { get; set; }
           public Emplacement ()
           {
               //CityName="";
               //State="";
               //Population="";
               //SpecialFeatures = SpecialFeatures.Highlight;
           }
        }
        public  enum SpecialFeatures
    	{
    	    None,
            Color,
            Highlight     
    	}
     
    }
    //classe liste de donnees exemple
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
     
    namespace WpfIndexGridViewCS
    {
       public  class Emplacements:  ObservableCollection<Emplacement>
        {
            //Field
           public Emplacement myEmplacement;
            public Emplacements()
            {
                myEmplacement = new Emplacement();
            }
            public Emplacements(Emplacement objEmplacement)
            {
                myEmplacement = objEmplacement;
            } 
     
        }
    }
    code behind du winform:
    Code c# : 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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    //needed
    using WpfIndexGridViewCS.Properties;
    using System.Collections.Specialized;
    using System.Reflection;
    using System.Configuration;
    namespace WpfIndexGridViewCS
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class WinIndexGridView : Window
        {
            //classe et collection exemple
            private Emplacement objEmplacement ;
            private  Emplacements   objEmplacements = new Emplacements();
            //variable 
            private GridViewColumn gvc ;
            // classe ColSettings ad-hoc (parametres Setting User) avec 2 props :
            // *rop EtatInitial =True
            // *prop lstCols (liste des colonnes à memoriser) 
            // classe MapCol:mappe 2 colonnes à memoriser :Header et Displaymember.Path
            private ColSettings myPrefsBis=new ColSettings();
            public WinIndexGridView()
            {
                InitializeComponent();
                this.DataContext = AddPlaces();
                // pour  resetter lors d'un test il suffit de 
                // remettre myPrefs.EtatInitial à true une fois seulement 
                // ensuite "comment it" dans les appels suivants 
                // pour voir comment la position de chaque header est memorise
                // myPrefsBis.EtatInitial = true;
            }
            private  Emplacements AddPlaces() 
            {
            objEmplacement = new Emplacement();
    		objEmplacement.CityName = "Paris";
    		objEmplacement.State = "France";
    		objEmplacement.Population = 1400000;
    		objEmplacement.SpecialFeatures = SpecialFeatures.None;
    		objEmplacements.Add(objEmplacement);
     
    		objEmplacement = new Emplacement();
    		objEmplacement.CityName = "Lyon";
            objEmplacement.State = "France";
    		objEmplacement.Population = 5000000;
    		objEmplacement.SpecialFeatures = SpecialFeatures.Highlight;
    		objEmplacements.Add(objEmplacement);
     
    		objEmplacement = new Emplacement();
    		objEmplacement.CityName = "Dijon";
            objEmplacement.State = "France";
            objEmplacement.Population = 500000;
    		objEmplacement.SpecialFeatures = SpecialFeatures.Color;
    		objEmplacements.Add(objEmplacement);
    		return objEmplacements;
     
            }
            private void btnAddPlaces_Click(object sender, RoutedEventArgs e)
            {
                objEmplacement = new Emplacement();
                objEmplacement.CityName = "Marseille";
                objEmplacement.State = "France";
                objEmplacement.Population = 600000;
                objEmplacement.SpecialFeatures = SpecialFeatures.None;
                objEmplacements.Add(objEmplacement);
     
                objEmplacement = new Emplacement();
                objEmplacement.CityName = "Toulouse";
                objEmplacement.State = "France";
                objEmplacement.Population = 6000000;
                objEmplacement.SpecialFeatures = SpecialFeatures.Highlight;
                objEmplacements.Add(objEmplacement);
     
                objEmplacement = new Emplacement();
                objEmplacement.CityName = "Nantes";
                objEmplacement.State = "France";
                objEmplacement.Population = 300000;
                objEmplacement.SpecialFeatures = SpecialFeatures.Color;
                objEmplacements.Add(objEmplacement);
            }
            // Load userSettings
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("etat initial :" + myPrefsBis.EtatInitial);
                if (myPrefsBis.EtatInitial)
                {
                    InitialisePrefs();
                }
                //Affecte liste headers et nom props sauves à  myGridView
    		    this.myGridView.Columns.Clear();
                foreach (MapCol mappe in myPrefsBis.lstCols)
                {
                    gvc = new GridViewColumn();
                    gvc.DisplayMemberBinding = new Binding(mappe.nameProp) ;
                    gvc.Header = mappe.Header;
                    gvc.Width = 100;
                    this.myGridView.Columns.Add(gvc);
                }
                //Bind ListviewTest.view to   myGridViewTest  
    		    this.myListeView.View = myGridView;
     
            }
            // Save userSettings
            private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                //Sauve liste headers  et noms props à partir de myGridView
                if (myPrefsBis == null)
                {
                    return;
                }
                this.myPrefsBis.lstCols.Clear();
                MapCol mappe ;
                foreach (GridViewColumn col in myGridView.Columns)
                {
                    mappe=new MapCol() ;
                    //nom headers
                    mappe.Header = col.Header.ToString(); 
                    //nom props
                    Binding bd = (Binding)col.DisplayMemberBinding;
                    mappe.nameProp = bd.Path.Path;
                    myPrefsBis.lstCols.Add(mappe);
     
                }
                //sauvegarde
                myPrefsBis.Save();
            }
            // Initialiser les  userSettings
            // à partir de ordre par defaut des colonnes du GridView savoir :
            // l'ordre de declaration des props dans classe 
            private void InitialisePrefs() 
            {
                myPrefsBis.lstCols = new List<MapCol>();
                MapCol mappe;
                foreach (GridViewColumn col in this.myGridView.Columns)
                {
                    mappe = new MapCol();
                    //nom headers
                    mappe.Header=col.Header .ToString();
                    //nom props(caster BindingBase sur Binding et retrouver Binding.Path.Path)
                    Binding bd = (Binding)col.DisplayMemberBinding; 
                    mappe.nameProp =bd.Path.Path;
                    myPrefsBis.lstCols.Add(mappe);
                }
     
                //Sauvegarde etat initial
                //on n'est plus au 1er lancement d'application
                myPrefsBis.EtatInitial = false;
                myPrefsBis.Save();
            }
     
        }
     
        // Application settings wrapper class. 
        // This class defines the settings we intend to use in our application.
        class ColSettings : ApplicationSettingsBase
        {
            //default value de EtatInitial est mise 
            //à true pour premier lancement app. ce qui 
            //pour effet d'appeler procedure InitialisePrefs().
            [UserScopedSettingAttribute()]
            [DefaultSettingValueAttribute("True")]
            public bool EtatInitial
            {
                get { return (bool)(this["EtatInitial"]); }
                set { this["EtatInitial"] = value; }
            }
     
            [UserScopedSetting()]
            [DefaultSettingValueAttribute("")]
            public List<MapCol> lstCols
            {
                get { return (List<MapCol>)(this["lstCols"]); }
                set { this["lstCols"] = value; }
            }
        }
        // classe qui mappe le Header et le DisplayMember.Path
        public class MapCol
        {
            public string Header { get; set; }
            public string nameProp { get; set; }
            public MapCol()
            { }
        }
    }
    code xaml du winform:
    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
    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
     
     
    <Window x:Class="WpfIndexGridViewCS.WinIndexGridView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfIndexGridViewCS"
        Title="Sauvegarde Index du GridView"  Height="300" Width="300" 
        Loaded="Window_Loaded"
        Closing="Window_Closing">
        <Window.Resources>
            <!--Header Style ListView-->
            <Style 
                x:Key="MyHeaderStyle" 
                TargetType="{x:Type GridViewColumnHeader}">
                <Setter 
                    Property="Foreground"
                    Value="LimeGreen"></Setter>
                <Setter
                    Property="Background"  
                    Value="White"/>
                <Setter
                    Property="FontFamily"  
                    Value="Microsoft Sans Serif"/>
                <Setter
                    Property="FontSize"  
                    Value="14"/>
            </Style>
        </Window.Resources>
        <DockPanel>
            <Label
                DockPanel.Dock="Top"
                Content="Sauvegarde Index du GridView"
                BorderBrush="Tomato" 
                Background="MintCream"
                FontSize="14"
                FontFamily="Times New Roman"
                FontStyle="Italic"
                FontWeight="Bold" 
                Foreground="RosyBrown"
                HorizontalContentAlignment="Center"
                VerticalAlignment="Center" 
                BorderThickness="2">
     
            </Label>
            <ListView 
                    DockPanel.Dock="Top"
                    x:Name="myListeView"
                    Background="LightYellow"
                    ItemsSource="{Binding}">
                <ListView.View>
                    <GridView 
                        x:Name="myGridView"
                        ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
                        <GridViewColumn 
                            Header="* City Name *"
                            DisplayMemberBinding="{Binding CityName}">
                        </GridViewColumn>
                        <GridViewColumn 
                            Header="* State *"
                            DisplayMemberBinding="{Binding State}">
                        </GridViewColumn>
                        <GridViewColumn 
                            Header="* Population *"
                            DisplayMemberBinding="{Binding Population}">
                        </GridViewColumn>
                        <GridViewColumn 
                                Header="* SpecialFeatures *"
                                DisplayMemberBinding="{Binding SpecialFeatures}">
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
            <Button   
                DockPanel.Dock="Top"
                x:Name="btnAddPlaces"
                Height="32" 
                Width="100"
                Click="btnAddPlaces_Click"
                >AddPlaces</Button>
        </DockPanel>
    </Window>

    Pour le datagrid les choses sont plus simples car chaque Column dispose d'une prop DisplayIndex de type int qu'il suffit de storer dans ColSettings sous forme de list<int>
    L'index permettant de retrouver aussi bien le Header que le DisplayMemberPath de la colonne......
    bon code..................

Discussions similaires

  1. comment définir la position des Items d'un DynamicForm ?
    Par nac dans le forum GWT et Vaadin
    Réponses: 0
    Dernier message: 13/04/2010, 17h00
  2. comment marche la position des éclairages
    Par skalimer0 dans le forum OpenGL
    Réponses: 3
    Dernier message: 16/11/2007, 15h18
  3. Comment sauvegarder la position des colonnes de mon tableau ?
    Par Bruno13 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 04/11/2007, 01h38
  4. Mémorisation la position des fenêtres ouvertes
    Par Gabout dans le forum Windows XP
    Réponses: 4
    Dernier message: 01/10/2007, 06h47
  5. Comment récupérer la position des icones du bureau ?
    Par bambino3996 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 29/09/2005, 18h38

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