J'ai un DataGrid WPF 4.0 qui est lié à un DataTable en utilisant AutoGenerateColumns = True. Les colonnes sont dynamiques, mais je sais qu'il y aura toujours une colonne nommée ID et je voudrais cacher cette colonne. Y a-t-il un moyen de le faire?Est-il possible de masquer une colonne spécifique dans un DataGrid lorsque AutoGenerateColumns = True?
Répondre
dans votre DataGrid, abonnez-vous pour l'événement AutoGeneratingColumn
, l'événement args
(DataGridAutoGeneratingColumnEventArgs
) a le nom de la colonne et un « Cancel
», si le nom de la colonne est ID puis définissez Cancel = true
. devrait faire l'affaire.
Je ne peux pas parler pour 4, mais ce n'était pas possible dans 3.5 SP1, au moins sans enregistrement pour un événement que je voulais éviter à tout prix.
Qu'est-ce que vous pourriez faire à la place est de changer le code de génération à AutoGenerateColumns=False
puis il suffit de placer les colonnes que vous aimez dans le XAML que les données sous-jacentes seront tous placés toujours dans les colonnes de façon appropriée
<dg:DataGridTextColumn Header="Display" Binding="{Binding DisplayName}"/>
<dg:DataGridTextColumn Header="Host" Binding="{Binding HostName}"/>
<dg:DataGridTextColumn Header="Database" Binding="{Binding Database}"/>
<dg:DataGridTextColumn Header="Username" Binding="{Binding Username}"/>
<dg:DataGridTextColumn Header="Password" Binding="{Binding Password}"/>
Cela permettra Vous pouvez afficher les seules colonnes qui vous intéressent par rapport au modèle sous-jacent, et modifier le Header
pour l'afficher comme bon vous semble. Vous n'êtes donc pas lié au nom Property
sur le modèle.
Ce n'est pas une option pour moi puisque je ne connais pas les noms de colonnes préalablement – Rachel
C'est ne pas être généré à partir d'un modèle? À quoi ressemblent les données ...? –
Le modèle contient uniquement une propriété DataTable qui contient les données à afficher dans le DataGrid. – Rachel
Je ne dirais pas qu'il est excellente solution ... mais ... vous pouvez avoir une couche supplémentaire d'abstraction par exemple, disons que vous avez un objet comme:
public class Foo
{
public string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
Vous ne voulez pas la colonne pour Id, donc vous créez un nouvel objet
public class Foo2
{
public string Property2 { get; set; }
public string Property3 { set; get; }
}
puis mappez/convertissez Foo en Foo2 et vous avez terminé.
Une autre façon possible (pas toujours possible) est de changer modificateur d'accès à interne
public class Foo
{
internal string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
cette façon, vous n'avez pas la colonne Id généré soit.
Autre possibilité serait Visibility.Collapsed
:
private void dataGrid_AutoGeneratingColumn(object sender,
DataGridAutoGeneratingColumnEventArgs e)
{
//Set properties on the columns during auto-generation
switch (e.Column.Header.ToString())
{
case "rownameYouWantToHide":
e.Column.Visibility = Visibility.Collapsed;
break;
}
}
Vous pouvez utiliser un comportement (code réutilisable) pour faire le travail ... De cette façon, vous pouvez utiliser l'attribut qui centraliserait la visibilité de la colonne en un seul endroit.
Utilisation:
<Window
...
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">
<DataGrid ...
extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">
...
public class YourObjectItem
{
[Browsable(false)]
public Assembly Assembly { get; set; }
code:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace WpfControlLibrary.Extension
{
public static class DataGridBehavior
{
public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty =
DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn",
typeof(bool),
typeof(DataGridBehavior),
new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged));
public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj)
{
return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty);
}
public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val)
{
obj.SetValue(UseBrowsableAttributeOnColumnProperty, val);
}
private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var dataGrid = obj as DataGrid;
if (dataGrid != null)
{
if ((bool) e.NewValue)
{
dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn;
}
else
{
dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn;
}
}
}
private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var propDesc = e.PropertyDescriptor as PropertyDescriptor;
if (propDesc != null)
{
foreach(Attribute att in propDesc.Attributes)
{
var browsableAttribute = att as BrowsableAttribute;
if (browsableAttribute != null)
{
if (! browsableAttribute.Browsable)
{
e.Cancel = true;
}
}
}
}
}
}
}
C'est exactement ce que je cherchais! Testé et fonctionnant sur .NET 4.6.1 :) – JoanComasFdz
Merci! C'est sympa de savoir que ça marche toujours bien :)! –
Le DataGrid devrait fonctionner de cette façon hors de la boîte à mon humble avis et ramasser l'en-tête du DisplayNameAttriibute aussi! – StuartQ
- 1. ASP.NET Datagrid - masquer une ligne/colonne spécifique
- 2. L'utilisation de Mode = TwoWay et AutogenerateColumns = True dans Silverlight 3 DataGrid
- 3. DataGridView non triable lorsque AutoGenerateColumns = true + Types anonymes?
- 4. Comment masquer l'en-tête de colonne dans un DataGrid WPF?
- 5. Est-il possible de masquer une colonne dans une table?
- 6. AutoGenerateColumns DataGridView est définie sur true en quelque sorte
- 7. WPF DataGrid Entity Framework: est-il possible de lier une colonne DataGrid à une méthode/fonction?
- 8. Masquer une colonne dans ASP.NET Dynamic Data
- 9. Tri d'une colonne spécifique dans un GridView après un DataBound
- 10. plusieurs composants DataGrid dans une colonne
- 11. Comment cacher DataGrid entier dans Silverlight?
- 12. comment cacher la colonne DataGrid
- 13. Masquer la colonne dans un JTable
- 14. Comment obtenir une position de colonne TRUE dans wxStyledTextCtrl?
- 15. Masquer une colonne dans un tableau peuplé par javascript
- 16. GridView AutoGenerateColumns et le tri
- 17. Silverlight Datagrid: Mettre en évidence une colonne entière lorsque cette colonne est triée
- 18. ASP.NET Afficher/Masquer les sections dans une ligne Datagrid
- 19. Colonne DataGrid personnalisée avec un CellTemplate et une liaison
- 20. datagrid dans une cellule datagrid
- 21. Jquery - Masquer div spécifique
- 22. Valeurs de format dans une Datagrid
- 23. Masquer la colonne dans la liste Sharepoint
- 24. Flex DataGrid Largeur de colonne
- 25. Colonne Datagrid Erreur de génération de tri
- 26. Lier une colonne DataGrid à la propriété ViewModel
- 27. Comment masquer une colonne dans JasperReports lors de l'exécution?
- 28. MvcContrib Grid - AutoGenerateColumns possible avec des objets complexes?
- 29. Commande de colonne DataGrid dans ActionScript
- 30. Largeur de colonne d'un DataGrid dans une application Windows Mobile
Ça marcherait ...Bien que cela va immédiatement à l'encontre du modèle MVVM ... mais fonctionnera sans aucun doute. –
Merci, cela fonctionnera bien. Dans ce cas, je ne m'intéresse pas trop à MVVM car le DataGrid fait partie d'un UserControl personnalisé et je n'ai aucun problème à utiliser le code-behind si c'est quelque chose qui n'affecte que la vue. – Rachel
@Aaron, si vous comptez sur la vue pour générer le MV, alors je pense que vous allez trouver qu'il n'est pas adhérent à MVVM :) –