none
Affichage D'une DataGrid dans un UserControl WPF RRS feed

  • Question

  • Bonjour, dans un projet WPF , j'utilise une base de donnée Access que j'insère dans un UserControl.

    Ce UserControl est contenu dans un StackPanel .

    Lorsque le Form s'affiche,dans le StakPanel il n'y a que les en tete de la base de donnée, il doit me manquer un bout de code dans UserControl Load il me semble afin que toute la base de donnée puisse s'afficher


    JF Collombet ® CreateSpecificCulture

    mercredi 9 mars 2016 16:51

Réponses

  • Vous devez y placer le résultat de votre requête Accces, ou votre liste de d'objet qui sert de source de données.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 11 mars 2016 07:35

Toutes les réponses

  • Pardon j'ai oublié de vous montrer le code :

    Public Class CartilageUC
        Private Sub UserControl_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    
            'Ne chargez pas vos données au moment du design.
            If Not (System.ComponentModel.DesignerProperties.GetIsInDesignMode(Me)) Then
                '	'Chargez vos données ici et assignez le résultat à CollectionViewSource.
                Dim myCollectionViewSource As System.Windows.Data.CollectionViewSource = CType(Me.Resources("Resource Key for CollectionViewSource"), System.Windows.Data.CollectionViewSource)
                myCollectionViewSource.Source = 
            End If
        End Sub


    JF Collombet ® CreateSpecificCulture

    mercredi 9 mars 2016 17:14
  • Bonjour,

    Pourquoi un StackPanel ? C'est n'est pas le Panel le plus approprié dans votre cas.

    Le DataGrid est un contrôle "complexe" qui embarque sa propre logique de layout avec notamment un ScrollViewer, par conséquent il ne s'agrandi pas en fonction de son contenu. Donc typiquement ce contrôle est placé dans une zone imposée, charge à lui d'afficher ces scrollbars en cas de besoin.

    Placez votre contrôle dans un Grid ou DockPanel par exemple, ou forcez la hauteur de votre DataGrid (mais ca va un eu à l'encontre du système de layout).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 10 mars 2016 08:11
  • Merci de votre réponse, je vais tester le DockPanel.

    Par contre cela ne résous pas mon problème d'affichage des données dans le DataGrid.


    JF Collombet ® CreateSpecificCulture

    jeudi 10 mars 2016 16:19
  • Désolé, j'avais zappé  :)

    La DataGrid possède une propriété ItemsSource bindable qui permet de définir la source des données, affectez lui votre source de données.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 10 mars 2016 16:24
  • Ok voici le code de ma Base de données.

    J'ai testé CartilageDataGrid.itemSource= ??  mais la je ne vois pas quoi mettre.

     <UserControl.Resources>
            <local:Base_de_données_Gestion_des_stocksDataSet x:Key="Base_de_données_Gestion_des_stocksDataSet"/>
            <CollectionViewSource x:Key="CartilageViewSource" Source="{Binding Cartilage, Source={StaticResource Base_de_données_Gestion_des_stocksDataSet}}"/>
        </UserControl.Resources>
        <Grid DataContext="{StaticResource CartilageViewSource}">
            <DataGrid x:Name="CartilageDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected">
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="_N__paletteColumn" Binding="{Binding N° palette}" Header="N° palette" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="Adresse_congèleColumn" Binding="{Binding Adresse congèle}" Header="Adresse congèle" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="ProduitsColumn" Binding="{Binding Produits}" Header="Produits" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="Poids_brutColumn" Binding="{Binding Poids brut}" Header="Poids brut" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="Tare_paletteColumn" Binding="{Binding Tare palette}" Header="Tare palette" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="Tare_cartonsColumn" Binding="{Binding Tare cartons}" Header="Tare cartons" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="Poids_netColumn" Binding="{Binding Poids net}" Header="Poids net" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="_N_lot_1Column" Binding="{Binding N°lot 1}" Header="N°lot 1" Width="SizeToHeader"/>
                    <DataGridTextColumn x:Name="_N__Lot_2Column" Binding="{Binding N° Lot 2}" Header="N° Lot 2" Width="SizeToHeader"/>
                    <DataGridTemplateColumn x:Name="Date_congélationColumn" Header="Date congélation" Width="SizeToHeader">
                        <DataGridTemplateColumn.CellTemplate>

      Private Sub UserControl_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    
            'Ne chargez pas vos données au moment du design.
            'If Not (System.ComponentModel.DesignerProperties.GetIsInDesignMode(Me)) Then
            CartilageDataGrid.ItemsSource =
            '	Dim myCollectionViewSource As System.Windows.Data.CollectionViewSource = CType(Me.Resources("Resource Key for CollectionViewSource"), System.Windows.Data.CollectionViewSource)
            '	myCollectionViewSource.Source = your data
            'End If
        End Sub


    JF Collombet ® CreateSpecificCulture

    jeudi 10 mars 2016 16:48
  • Haa mais vous avez tout qui passe par le binding.

    Donc en effet dans votre cas vous devez seulement affecter vos données à 'myCollectionViewSource.Source' dans votre événement 'UserControl_Loaded'.

    Dans votre XAML vous avez votre CollectionViewSource qui est instanciée. Ensuite votre Grid parente à son 'DataContext' bindé sur cette collection. Ensuite votre DataGrid à son 'ItemSource' bindé sur le DataContext de la grille (ItemsSource="{Binding}") donc sur la collection.

    Le principe de binding permet aux contrôles de détecter un changement de valeur dans la propriété source. Ce qui veut dire que lorsque vous modifiez la propriété 'Source' de votre collectionViewSource, le binding propage les modifications jusque dans votre DataGrid qui va donc rafraichir ces données.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 10 mars 2016 16:56
  •    Private Sub UserControl_Loaded(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded
    
            'Ne chargez pas vos données au moment du design.
            If Not (System.ComponentModel.DesignerProperties.GetIsInDesignMode(Me)) Then
                '	'Chargez vos données ici et assignez le résultat à CollectionViewSource.
                Dim myCollectionViewSource As System.Windows.Data.CollectionViewSource = CType(Me.Resources("Resource Key for CollectionViewSource"), System.Windows.Data.CollectionViewSource)
                myCollectionViewSource.Source = 
            End If
        End Sub

    Que dois-je mettre dans "myCollectionViewSource.Source" = ???

    Merci de votre aide (encore une fois) 


    JF Collombet ® CreateSpecificCulture

    jeudi 10 mars 2016 17:04
  • Vous devez y placer le résultat de votre requête Accces, ou votre liste de d'objet qui sert de source de données.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 11 mars 2016 07:35