Ho un DataGrid di WPF 4.0 associato a un DataTable che utilizza AutoGenerateColumns = True. Le colonne sono dinamiche, tuttavia so che ci sarà sempre una colonna di nome ID e vorrei nascondere questa colonna. C'è un modo per farlo?C'è un modo per nascondere una colonna specifica in un DataGrid quando AutoGenerateColumns = True?
C'è un modo per nascondere una colonna specifica in un DataGrid quando AutoGenerateColumns = True?
risposta
nel vostro datagrid, sottoscrivere l'evento AutoGeneratingColumn
, l'evento args
(DataGridAutoGeneratingColumnEventArgs
) ha il nome di colonna e un "Cancel
", se il nome di colonna è ID quindi impostare Cancel = true
. dovrebbe fare il trucco
Non posso parlare per 4, tuttavia non era possibile in 3.5 SP1, almeno senza registrarsi per un evento che volevo evitare a tutti i costi.
cosa si potrebbe fare, invece, è modificare il codice di generazione in AutoGenerateColumns=False
poi basta posizionare le colonne che ti interessano all'interno del XAML come i dati sottostanti saranno tutti ancora essere collocati all'interno delle colonne in modo appropriato
<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}"/>
questo permetterà per visualizzare le sole colonne che ti interessano in relazione al modello sottostante e modificare lo Header
da visualizzare come meglio credi, quindi non sei legato al nome Property
sul modello.
io non direi che è grande soluzione ... ma ... si può avere un ulteriore livello di astrazione per esempio diciamo che si dispone di un oggetto come:
public class Foo
{
public string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
non si vuole colonna per Id, in modo da creare un nuovo oggetto
public class Foo2
{
public string Property2 { get; set; }
public string Property3 { set; get; }
}
poi map/convertire Foo a foo2 e si è fatto.
Un altro possibile modo (non sempre possibile) è cambiare modificatore di accesso al interno
public class Foo
{
internal string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
in questo modo non sarà necessario colonna ID generato sia.
Altra possibilità sarebbe 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;
}
}
È possibile utilizzare un comportamento (codice riutilizzabile) per fare il lavoro ... In questo modo è possibile utilizzare l'attributo che centralizzare la visibilità della colonna in un unico luogo.
Usage:
<Window
...
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">
<DataGrid ...
extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">
...
public class YourObjectItem
{
[Browsable(false)]
public Assembly Assembly { get; set; }
Codice:
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;
}
}
}
}
}
}
}
Questo è esattamente quello che stavo cercando! Testato e funzionante su .NET 4.6.1 :) – JoanComasFdz
Grazie! È bello sapere che funziona ancora bene :)! –
Il DataGrid dovrebbe funzionare in questo modo fuori dalla scatola IMHO e raccogliere anche l'intestazione da DisplayNameAttriibute! – StuartQ
- 1. un modo in C++ per nascondere una funzione specifica
- 2. Come nascondere l'intestazione della colonna in un DataGrid di WPF?
- 3. Come nascondere una colonna specifica di un oggetto DataGridView?
- 4. WPF DataGrid - Nascondere la colonna usando un CheckBox
- 5. Qualsiasi modo per manipolare le colonne in GridView con AutoGenerateColumns = true?
- 6. Come nascondere colonne generate automaticamente in DataGrid?
- 7. DataGrid edition 'EditItem' non è consentito per questa vista` quando associato a un WPF DataGrid
- 8. Come selezionare tutto CheckBox di una colonna da DataGrid HeadBox CheckBox in WPF DataGrid
- 9. WPF DataGrid - Perché la colonna in più
- 10. applica strsplit a una colonna specifica in un data.frame
- 11. Ridimensionamento della colonna datagrid con CanUserResize = "True" non funziona in WPF
- 12. C'è un modo per lo stile un WPF DataGrid NewItem Segnaposto
- 13. C'è un modo per disabilitare una notazione specifica in Coq?
- 14. Come nascondere una colonna excel?
- 15. Come rimuovere o nascondere una particolare colonna in un datatable?
- 16. Come nascondere una colonna in un controllo ListView?
- 17. Bind datagrid visibilità colonna MVVM
- 18. Larghezza colonna DataGrid vincolante
- 19. Un modo efficiente per confrontare un valore NULL o un valore per una colonna in SQL
- 20. nascondere una colonna nella JTable
- 21. WPF DataTrigger da visualizzare e nascondere la colonna griglia XAML
- 22. Aggiunta di un evento di scorrimento per DataGrid
- 23. rimuovere una colonna specifica NumPy
- 24. Rails migrazione per fare un null colonna => true
- 25. Datagrid in WPF - 1 colonna predefinita ordinata
- 26. Ottieni colonna per intestazione colonna in WPF DataGrid
- 27. Larghezza colonna di un DataGrid in un'applicazione Windows Mobile
- 28. DataGrid WPF: Cancella ordinamento colonna
- 29. C'è un modo per applicare una colonna univoca usando doctrine2?
- 30. Come posso definire le mie colonne in un DataGrid WPF?
Quello funzionerebbe ...sebbene vada subito contro il pattern MVVM ... ma senza dubbio funzionerà. –
Grazie, funzionerà bene. In questo caso, non mi interessa molto MVVM poiché DataGrid è parte di un controllo utente personalizzato e non ho problemi a utilizzare code-behind se si tratta di qualcosa che riguarda solo la vista. – Rachel
@Aaron, se ti affidi alla vista per generare la MV, allora penso che scoprirai che non è aderente a MVVM :) –