none
ajouts de colonnes dynamiquement et template dans un Datagrid WPF RRS feed

  • Question

  • Bonjour tout le monde,

    j'ai un datagrid (wpftoolkit) dans lequel je bind des données à partir du résultat retourné par une requête SQL. je note que le type de données que je manipule sont soit les types définit en SQL soit des UDTs. La une base de données est dans une instance de SQL SERVER.

    j'ai des types UDT qui héritent de la classe ArrayList et implantent l'interface les interfaces IList et INullable.

    je souhaite présenter ces données dans le datagrid, selon une charte graphique: si la colonne contient des données de type SQL alors laisser le datagrid prendre en charge l'affichage de cette colonne, sinon si la colonne contient des données de type UDT utiliser la méthode ToString() (définie dans un type UDT) pour afficher ces données.

    remarque si je laisse Le datagrid gérer l'affichage de ces types UDT (qui héritent de ArrayList) ces colonnes affichent :

    Collection

    Collection

    Collection

    Collection

    ... 

     

    et je fais un copie une cellule dans une colonne de type UDT et je le colle dans blocnote j'ai la valeur de cette cellule.

     

    ce problème est déjà traite en asp dans http://www.codeproject.com/KB/webforms/ASPNET_DataGrid_creation.aspx et http://www.tek-tips.com/faqs.cfm?fid=4867

    y a t il ne solution pour en WPF?

     

    merci d'avance


    PhD - Student
    samedi 17 juillet 2010 16:39

Réponses

  • Bonjour,

     

    J’ai trouvé ces discussions sur ce sujet. J’espère qu’elles vous seront utiles :

    http://social.msdn.microsoft.com/Forums/en/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

    http://stackoverflow.com/questions/613158/programmatically-create-wpf-datagridtemplatecolumn-for-datagrid

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse OmarioS jeudi 22 juillet 2010 11:56
    lundi 19 juillet 2010 08:57
  • Bonjour Alex,

    J'ai consulté le contenu du premier lien qui aborde la problèmatique que je soulève. Par contre, le deuxième lien 

    j'ai pas très bien compris son contenu ...

    Comme indiqué dans le premier lien, 

    j'ai associé la méthode 
      private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
      {
       
       if (e.PropertyType.BaseType.Equals(typeof(AListOf)))
       {
        MyDataColumnTemplate col = new MyDataColumnTemplate();
        col.ColumnName = e.PropertyName; // so it knows from which column to get MyData
        col.CellTemplate = (DataTemplate)FindResource("MyDataTemplate");
        e.Column = col;
        e.Column.Header = e.PropertyName;
       }
      }
    

    à mon datagrid suivant 
    <wpfToolKit:DataGrid x:Name="myDataGrid"
       AutoGenerateColumns="True"
       AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn"
       ItemsSource="{Binding}"
       SelectionUnit="CellOrRowHeader"
       AlternationCount="2">
    
    toujours en suivant les indication 

    j'ai ajouté la classe "MyDataColumnTemplate"
    internal class MyDataColumnTemplate : DataGridTemplateColumn
     {
      public string ColumnName
      {
       get;
       set;
      }
    
      protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
      {
       // The DataGridTemplateColumn uses ContentPresenter with your DataTemplate.
       ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
       // Reset the Binding to the specific column. The default binding is to the DataRowView.
       BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
       return cp;
      }  
     }
    
    AListOf est la classe abstraite de base de mes UDTs en question. (et AListOf hérite de ArrayList). Maintenant, j'ai définit 
     "MyDataTemplate" dans le Xaml.
     <UserControl.Resources>
      <ResourceDictionary>
       <DataTemplate x:Key="MyDataTemplate" DataType="{x:Type local:AListOf}">
        <TextBlock x:Name="theTextBlock" HorizontalAlignment="Center"
           VerticalAlignment="Center" Margin="5,0,0,0" 
           Text="{Binding Path=ToString()}" />
       </DataTemplate>
      </ResourceDictionary>
     </UserControl.Resources>
    

    Je souhaite afficher dans mon datagrid le résultat retourné par la méthode ToString() (qui fait partie des spécifications des 

    UDT)

    avant le datagrid m'affichait (pour les instances des UDTs ayant AListOF comme classe de base)
    (Collection)
    (Collection)
    (Collection)
    (Collection)
    (Collection)
    ...

    maintenant il m'affiche 
    ""
    ""
    ""
    ""
    ...

    il semble que le binding que j'ai fait dans "MyDataTemplate" n'est pas le bon : Text="{Binding Path=ToString()}" n'est pas le bon.

    le binding ne marche que pour les attributs et propriétés ou c'est valable pour les members et les méthodes en particulier?

    Merci de votre aide :)




    PhD - Student
    • Marqué comme réponse OmarioS jeudi 22 juillet 2010 11:56
    mercredi 21 juillet 2010 14:06

Toutes les réponses

  • Bonjour,

     

    J’ai trouvé ces discussions sur ce sujet. J’espère qu’elles vous seront utiles :

    http://social.msdn.microsoft.com/Forums/en/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

    http://stackoverflow.com/questions/613158/programmatically-create-wpf-datagridtemplatecolumn-for-datagrid

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse OmarioS jeudi 22 juillet 2010 11:56
    lundi 19 juillet 2010 08:57
  • Bonjour OmarioS,

     

    Est-ce que vous avez avancé avec ce projet ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mercredi 21 juillet 2010 08:42
  • Bonjour Alex,

    J'ai consulté le contenu du premier lien qui aborde la problèmatique que je soulève. Par contre, le deuxième lien 

    j'ai pas très bien compris son contenu ...

    Comme indiqué dans le premier lien, 

    j'ai associé la méthode 
      private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
      {
       
       if (e.PropertyType.BaseType.Equals(typeof(AListOf)))
       {
        MyDataColumnTemplate col = new MyDataColumnTemplate();
        col.ColumnName = e.PropertyName; // so it knows from which column to get MyData
        col.CellTemplate = (DataTemplate)FindResource("MyDataTemplate");
        e.Column = col;
        e.Column.Header = e.PropertyName;
       }
      }
    

    à mon datagrid suivant 
    <wpfToolKit:DataGrid x:Name="myDataGrid"
       AutoGenerateColumns="True"
       AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn"
       ItemsSource="{Binding}"
       SelectionUnit="CellOrRowHeader"
       AlternationCount="2">
    
    toujours en suivant les indication 

    j'ai ajouté la classe "MyDataColumnTemplate"
    internal class MyDataColumnTemplate : DataGridTemplateColumn
     {
      public string ColumnName
      {
       get;
       set;
      }
    
      protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
      {
       // The DataGridTemplateColumn uses ContentPresenter with your DataTemplate.
       ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
       // Reset the Binding to the specific column. The default binding is to the DataRowView.
       BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
       return cp;
      }  
     }
    
    AListOf est la classe abstraite de base de mes UDTs en question. (et AListOf hérite de ArrayList). Maintenant, j'ai définit 
     "MyDataTemplate" dans le Xaml.
     <UserControl.Resources>
      <ResourceDictionary>
       <DataTemplate x:Key="MyDataTemplate" DataType="{x:Type local:AListOf}">
        <TextBlock x:Name="theTextBlock" HorizontalAlignment="Center"
           VerticalAlignment="Center" Margin="5,0,0,0" 
           Text="{Binding Path=ToString()}" />
       </DataTemplate>
      </ResourceDictionary>
     </UserControl.Resources>
    

    Je souhaite afficher dans mon datagrid le résultat retourné par la méthode ToString() (qui fait partie des spécifications des 

    UDT)

    avant le datagrid m'affichait (pour les instances des UDTs ayant AListOF comme classe de base)
    (Collection)
    (Collection)
    (Collection)
    (Collection)
    (Collection)
    ...

    maintenant il m'affiche 
    ""
    ""
    ""
    ""
    ...

    il semble que le binding que j'ai fait dans "MyDataTemplate" n'est pas le bon : Text="{Binding Path=ToString()}" n'est pas le bon.

    le binding ne marche que pour les attributs et propriétés ou c'est valable pour les members et les méthodes en particulier?

    Merci de votre aide :)




    PhD - Student
    • Marqué comme réponse OmarioS jeudi 22 juillet 2010 11:56
    mercredi 21 juillet 2010 14:06
  • le binding ne marche que pour les attributs et propriétés ou c'est valable pour les members et les méthodes en particulier?

    je viens de me rendre compte que j'ai dit/fait une bétise ... faire du binding avec une méthode MaMethode() n'est pas possible. par définition une méthode est une fonction qui retourne une valeur ... 

     

    et je me répond , donc ce n'est valable que pour les propriétés :)

     

    dans ce cas là, je dois ajouter une propriété dans la classe AListOf qui retourne le résultat de ToString().

    et je pose la question suivante 

    est il possible d'affecter à Text (dans  MyDataTemplate ) la valeur retournée par la méthode  ToString() ?

    Cela explique le faite que dans mon datagrid j'ai 

    ""
    ""
    ""
    ""
    ...
     car au cours de l'exécution la CLR ne trouve pas la propriété "" ToString()

     

     


    PhD - Student
    mercredi 21 juillet 2010 15:05