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 :

Bug selection d'une cellule d'un datagrid


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 69
    Par défaut Bug selection d'une cellule d'un datagrid
    Bonjour,
    je viens une nouvelle fois à vous en espérant que vous aurez la réponse à mon problème. Il y a quelques temps je suis venu ici car j'avais un problème pour sélectionner une cellule bien précise d'un datagrid et lui mettre un background.
    Il en est ressortie (avec un peu de remaniement de code de ma par) une méthode qui me récupère ma cellule selon la ligne et la colonne du datagrid appelé :


    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
    private DataGridCell recupDataGridCell(DataGrid datagrid, int ligne,int colonne)
    {
      MessageBox.Show("ok");
      // Recherche de la ligne
      if ((datagrid == null)||(VisualTreeHelper.GetChildrenCount(datagrid) == 0)) 
    	   return null;
      DataGridRowsPresenter drp = FindFirstOfType<DataGridRowsPresenter>(datagrid);
     
      if ((drp == null) || (VisualTreeHelper.GetChildrenCount(drp) < ligne)) 
    	   return null;
      DataGridRow dr = VisualTreeHelper.GetChild(drp, ligne) as DataGridRow;
     
      // Recherche du champs 
      if ((dr == null) || (VisualTreeHelper.GetChildrenCount(dr) == 0)) 
    	   return null;
      DataGridCellsPanel cellP = FindFirstOfType<DataGridCellsPanel>(dr);
     
      if ((cellP == null) || (VisualTreeHelper.GetChildrenCount(cellP) < colonne)) 
    	   return null;
      DataGridCell cell = VisualTreeHelper.GetChild(cellP, colonne) as DataGridCell;
     
      return cell;
    }
     
     
    private T FindFirstOfType<T>(DependencyObject item) where T : DependencyObject
    {
      // Si notre item est du type recherché, on le renvoie
      if (item is T) 
    	return item as T;
     
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(item); i++)
      {
    	T x = FindFirstOfType<T>(VisualTreeHelper.GetChild(item, i));
    	if (x != null) 
    		return x;
      }
      return null;
    }

    Ce code marche très bien si je dois utiliser une datagrid de 5-6 lignes. Cependant quand je dois utiliser des datagrids d'une cinquantaine de ligne, il commence à y avoir un bug. En effet, lorsqu'on utilise la scrollbar pour voir les lignes plus bas puis qu'on remonte la scrollbar, les cellules coloriées ne sont plus les mêmes. Je pense que le problème viens du fait que je récupère mes cellules avec un VisualTreeHelper qui va regarder ce qu'on voit dans notre affichage à un instant donné (les cellules que je récupère doivent être dynamique je suppose par rapport à mon affichage).

    Ce n'est bien sur qu'une supposition mais j'avoue que si qqn avait une idée sur comment résoudre ce problème, cela me serait d'une grande aide.

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    c'est peut etre lié au fait que le binding n'est vraiment effectif
    que lorsque que les chose sont afficher
    je m'explique
    si tu change les valeurs de fond quand les cellules ne sont plus visible elle perdent ces valeurs et quand elles redeviennent visible elles ont les valeurs par defaut

    le mieux serait d'avoir dans ton objet une valeur indiquant le fond et de binder cette valeur sur le fond de la celulle ...

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 69
    Par défaut
    Je viens d'essayer mais ca me fait pareil.
    C'est comme si la cellule que j'avais n'était pas une cellule précise du datagrid,
    mais qu'elle est dynamique suivant ma vue, ou du moins, ce qui est dynamique
    n'est pas la colonne mais uniquement la ligne (je pense que c'est important de le signaler).

    En gros si je change mon background de ma cellule 3, si je touche à la scrollbar,
    la couleur ira aléatoirement sur la cellule 28 puis 2 (elle ne revient pas forcement sur le 3 de départ quand je reviens tout en haut), puis 56, etc...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    oui je crois qu'en fait quand il cree le data grid il reutilise les cellule visible pour y mettre d'autres donnees
    je t'avais dit qu'a mon sens c'etait peut etre plus simple d'utiliser une listview

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 69
    Par défaut
    Dans le cas d'une listview, comment je fais pour modifier le background d'une cellule précise ? (je pense que j'ai pas trop le choix, je vais devoir abandonner le datagrid)

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    dans une list view tu peux mettre des GridViewColumn
    par exemple
    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
     
    <GridViewColumn Header="{DynamicResource T_HEADER_VALUEMS}" Width="Auto">
                                                                <GridViewColumn.CellTemplate>
                                                                    <DataTemplate>
                                                                        <SASComp:NumericTextBoxEx  Margin="1,1,1,1" 
                                                                            Width="90"
                                                                            DoubleValue="{Binding Path=Txx, Mode=TwoWay}" Mode="Double"
                                                                            DataContext="{Binding Path=.}"                                                                                           
                                                                            Background="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"
                                                                            GotFocus="TextBox_GotFocus2"
                                                                            TextAlignment="Center"
                                                                        />
                                                                    </DataTemplate>
                                                                </GridViewColumn.CellTemplate>
                                                            </GridViewColumn>
    et la tu peux binder ton background sur ce que tu veux

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

Discussions similaires

  1. [WPF] selection d'une cellule ds une DataGrid
    Par Seals dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 25/03/2011, 10h00
  2. selection d'une cellule sur une certaine ligne
    Par florent149 dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 20/07/2006, 17h37
  3. [VB.NET]Valeur d'une cellule d'un datagrid
    Par Franck2mars dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/04/2006, 09h39
  4. [C#] Attribuer une valeur a une cellule d'un DataGrid
    Par linuxludo dans le forum Windows Forms
    Réponses: 16
    Dernier message: 19/11/2005, 17h42
  5. [C#]Changer l'image d'une cellule d'un datagrid
    Par Scorff dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/04/2005, 09h35

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