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

Silverlight Discussion :

Silverlight problème checkbox dans DataGrid


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Par défaut Silverlight problème checkbox dans DataGrid
    Bonjour
    Je cherche à mettre en place un DataGrid en Silverlight ayant comme première colonne des checkBox. Une fois fini je me trouve devant un gros problème, les checkbox sont en conflit ; lors ce que j’en check une, d’autre se check et certaine checké perdent leurs check. Ce problème se montre lors ce que je scroll dans la DataGrid.

    Quelqu’un a-t-il déjà rencontré ce problème ?

    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
    <sdk:DataGrid IsReadOnly="True" 
    AutoGenerateColumns="False" x:Name="myGrid" Margin="0" Visibility="Visible" AllowDrop="False" ColumnWidth="*" MinHeight="100" RowHeaderWidth="30" RowHeight="20" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTemplateColumn Width="80">
                            <sdk:DataGridTemplateColumn.HeaderStyle>
                                <Style TargetType="sdk:DataGridColumnHeader">
                                    <Setter Property="ContentTemplate">
                                        <Setter.Value>
                                            <DataTemplate>
                                                <Grid>
                                                    <CheckBox x:Name="chkSelectAll" Margin="2,0,0,0" Content="Select" d:LayoutOverrides="Width, Height" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                                                </Grid>
                                            </DataTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </sdk:DataGridTemplateColumn.HeaderStyle>
                            <sdk:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox x:Name="check_row" VerticalAlignment="Center" IsChecked="false" HorizontalAlignment="Center" HorizontalContentAlignment="Center"/>
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellTemplate>
                        </sdk:DataGridTemplateColumn>
                        <sdk:DataGridTextColumn Header="champ1" Binding="{Binding champ1}" />
                        <sdk:DataGridTextColumn Header="champ2" Binding="{Binding champ2}" IsReadOnly="True" />
                        <sdk:DataGridTextColumn Header="champ3" Binding="{Binding champ3}" IsReadOnly="True" />
                        <sdk:DataGridTextColumn Header="champ4" Binding="{Binding champ4}" IsReadOnly="True" />
                        <sdk:DataGridTextColumn Header="champ5" Binding="{Binding champ5}" IsReadOnly="True" />
                        <sdk:DataGridTextColumn Header="champ6" Binding="{Binding champ6}" IsReadOnly="True" />
                        <sdk:DataGridTemplateColumn Header="Action" Width="SizeToCells" IsReadOnly="True">
                            <sdk:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Grid Width="118">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="36"/>
                                            <ColumnDefinition Width="82"/>
                                        </Grid.ColumnDefinitions>
                                        <Button Content="Détail" Tag="{Binding cham1}" Click="BoutonsDetail_Click" Margin="2" FontSize="9" FontFamily="Times New Roman" />
                                        <Button Content="Ajouter au panier" Tag="{Binding ProductID}" Click="BoutonsGrid_Click" Margin="2" FontSize="9" FontFamily="Times New Roman" Grid.Column="1" />
                                    </Grid>
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellTemplate>
                        </sdk:DataGridTemplateColumn>
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>
    Merci beaucoup

  2. #2
    Membre actif Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut
    C'est malheureusement un problème connu, dû au fonctionnement de la DataGrid qui recycle et réutilise les lignes lors du scrolling.

    Le sujet est pas mal discuté sur les forums silverlight.net :
    http://forums.silverlight.net/forums...12/267339.aspx
    http://forums.silverlight.net/forums...56/298670.aspx
    http://forums.silverlight.net/forums...79/350025.aspx

    Une solution semble être de modifier le Template de la DataGrid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ScrollViewer  HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"  VerticalScrollBarVisibility="Auto">
            <dataPrimitives:DataGridRowsPresenter x:Name="RowsPresenter"/>
    </ScrollViewer>
    Je n'ai jamais essayé, mais il y a des chances pour que ça casse la virtualisation.
    Dans tous les cas, si tu trouves une solution, ça m'intéresse

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 20
    Par défaut
    Merci beaucoup freezer08, j'avais vu quelque part cette histoire de virtualisation mais je n'avais pas comprit.

    Avec ta réponse j'ai trouver une solution :

    on peut utiliser l'evenement "Loading_Row(vers MSDN)" pour controler la valeur des checkBox que sont en cours de chargement. Il faut pour cela créer une List(Of Object) pour stocker les objects (qui constitu chaque ligne de Grid) qui ou la checkBox est checké :

    Exemple en C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void dgPerson_LoadingRow(object sender, DataGridRowEventArgs e)
    {
       CheckBox chk = (CheckBox)this.dgPerson.Columns[0].GetCellContent(e.Row);
       Person p = chk.DataContext as Person;
       chk.IsChecked = personList.Contains(p);
    }
    Exemple en VB.Net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub dgPerson_LoadingRow(sender As Object, e As DataGridRowEventArgs)
     
    	Dim chk As CheckBox = DirectCast(Me.dgPerson.Columns(0).GetCellContent(e.Row), CheckBox)
    	Dim p As Person = TryCast(chk.DataContext, Person)
    	chk.IsChecked = personList.Contains(p)
    End Sub

  4. #4
    Membre actif Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut
    Je ne m'étais pas attardé sur ton code, au temps pour moi.
    D'autres solutions :
    - Utiliser une DataGridCheckBoxColumn
    - Utiliser le pattern MVVM, en bindant les données sur ta DataGrid.
    Un lien sur le sujet :
    http://weblogs.asp.net/dwahlin/archi...lications.aspx

    Autrement, dans l'absolu, le LoadingRow fonctionne aussi

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

Discussions similaires

  1. Problème CheckBox dans JTable
    Par l4r3nZu dans le forum Composants
    Réponses: 2
    Dernier message: 28/05/2011, 14h02
  2. problème checkbox dans gridview
    Par math33 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 11/05/2010, 15h14
  3. Problème checkbox dans getJspContext().getOut().write(etc)
    Par mumu27 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 02/02/2010, 14h31
  4. problème CheckBox dans une Datatable
    Par rc.dev2009 dans le forum JSF
    Réponses: 3
    Dernier message: 23/04/2009, 17h47
  5. Problème Checkbox and Datagrid
    Par midotoon dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/10/2008, 19h59

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