Ich habe ein WPF 4.0 DataGrid, das mit AutoGenerateColumns = True an eine DataTable gebunden ist. Die Spalten sind dynamisch, aber ich weiß, dass es immer eine Spalte namens ID geben wird, und ich möchte diese Spalte ausblenden. Kann ich das irgendwie machen?Gibt es eine Möglichkeit, eine bestimmte Spalte in einem DataGrid zu verbergen, wenn AutoGenerateColumns = True?
Antwort
in Ihrem Datagrid, für die AutoGeneratingColumn
Ereignis abonnieren, wird das Ereignis args
(DataGridAutoGeneratingColumnEventArgs
) hat den Spaltennamen und ein „Cancel
“, wenn der Spaltenname dann Cancel = true
eingestellt ID ist. sollte den Trick machen.
Ich kann nicht für 4 sprechen, aber es war nicht in 3.5 SP1, zumindest ohne Registrierung für ein Ereignis, das ich um jeden Preis vermeiden wollte.
Was könnten Sie tun, stattdessen ist Ihre Generation Code AutoGenerateColumns=False
ändern legen Sie dann nur die Spalten Sie in der XAML kümmern, da die zugrunde liegenden Daten werden alle noch in geeigneter Weise
<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}"/>
Diese in den Spalten platziert werden können Sie können die einzigen Spalten anzeigen, die Ihnen in Bezug auf das zugrunde liegende Modell wichtig sind, sowie die Header
Anzeige so ändern, wie Sie es für richtig halten, so dass Sie nicht an den Property
Namen des Modells gebunden sind.
würde ich nicht sagen, dass es große Lösung ... aber ... können Sie eine weitere Abstraktionsschicht zum Beispiel haben wir sagen, Sie haben ein Objekt wie:
public class Foo
{
public string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
Sie wollen nicht Spalte für Id, so dass Sie ein neues Objekt erstellen
dann Karte/konvertieren Foo zu Foo2 und Sie sind fertig.
Eine weitere Möglichkeit (nicht immer möglich) sind Sie Id Spalte entweder erzeugt haben keinen Zugriff Modifikator interne
public class Foo
{
internal string Id { get; set; }
public string Property2 { get; set; }
public string Property3 { set; get; }
}
diese Art und Weise zu ändern.
Andere Möglichkeit wäre 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;
}
}
Sie ein Verhalten (Mehrweg-Code) verwenden können, um die Arbeit zu tun ... Auf diese Weise können Attribut verwenden können, die die Spalte Sichtbarkeit an einem Ort zentralisieren würde.
Verbrauch:
<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;
}
}
}
}
}
}
}
Genau das habe ich gesucht! Getestet und arbeitet an .NET 4.6.1 :) – JoanComasFdz
Danke! Es ist schön zu wissen, dass es immer noch gut funktioniert :)! –
Das DataGrid sollte diesen Weg aus der Box IMHO und holen Sie sich die Überschrift aus dem DisplayNameAttribute auch! – StuartQ
- 1. Gibt es eine Möglichkeit, Fenstereigenschaften zu verbergen?
- 2. Gibt es eine Möglichkeit, eine WPF-Datagrid NewItem Platzhalter stylen
- 3. Gibt es eine Möglichkeit, eine MessageBox zu verbergen?
- 4. Gibt es eine Möglichkeit, je nach Zeile eine Verknüpfungsschaltfläche in einem Aktionspanel zu verbergen/anzuzeigen
- 5. Gibt es eine Möglichkeit, die Bildlaufleisten in IE8 zu verbergen?
- 6. Wie kann ich in WPF eine Datagrid-Spalte an eine bestimmte Spalte einer Datentabelle binden?
- 7. Gibt es eine bessere Möglichkeit, das backBarButtonItem zu verbergen?
- 8. Gibt es eine Möglichkeit, die ID-Spalte in Keystone.js zu verbergen?
- 9. Eine Möglichkeit, die Spalten in GridView mit AutoGenerateColumns zu bearbeiten = true?
- 10. Gibt es eine Möglichkeit, bestimmte UIImageView-Eigenschaften zu erhalten?
- 11. Gibt es eine Möglichkeit, Variablen in einem Array zu deklarieren?
- 12. Gibt es eine Möglichkeit, onPanResponderMove zu verwalten?
- 13. Gibt es eine Möglichkeit, EditActionsForRowAtIndexPath nur für eine bestimmte UITableViewCell in Swift zu implementieren?
- 14. Gibt es eine bessere Möglichkeit, eine DateTime auf eine bestimmte Genauigkeit zu trimmen?
- 15. Gibt es eine Möglichkeit, eine einzelne FindBugs-Warnung zu ignorieren?
- 16. Gibt es eine Möglichkeit, Textumbruch in einem Textfeld zu erkennen?
- 17. Gibt es eine Möglichkeit, eine Variable in LaTeX zu definieren?
- 18. Gibt es eine Möglichkeit zu verwenden Wenn Bedingung in einem Suchbefehl mit Option Exec?
- 19. Gibt es eine Möglichkeit zu sagen, in welcher DLL sich eine bestimmte .net-Assembly befindet?
- 20. Gibt es eine Möglichkeit, in AnimatedVectorDrawables auf AnimationsVectorDrawables zu hören?
- 21. Gibt es eine Möglichkeit, "träge" zu lesen?
- 22. Gibt es eine Möglichkeit, eine Methode zu erzwingen, bestimmte Methodensignatur zu folgen?
- 23. Gibt es eine Möglichkeit, Datenbanktransaktionen zu beschleunigen?
- 24. Gibt es eine Möglichkeit, eine Testdatenbank in Katalysator zu verwenden?
- 25. Gibt es eine Möglichkeit, Formularantwort zu ignorieren?
- 26. In groovy, gibt es eine Möglichkeit zu überprüfen, ob ein Objekt eine bestimmte Methode hat?
- 27. Gibt es eine Möglichkeit, eine Funktion in jQuery zu deaktivieren?
- 28. Gibt es eine Möglichkeit, Mehrfacheinspritzung zu propagieren?
- 29. Gibt es eine Möglichkeit, Webkonsolenfehler zu erkennen?
- 30. Gibt es eine Möglichkeit, AMDPlugin zu deaktivieren?
Das würde funktionieren ...obwohl es sofort gegen das MVVM-Muster geht ... aber zweifellos funktionieren wird. –
Danke, das wird gut funktionieren. Ich bin in diesem Fall nicht zu sehr mit MVVM beschäftigt, da das DataGrid Teil eines benutzerdefinierten Benutzersteuerelements ist und ich keine Probleme habe, Code-Behind zu verwenden, wenn es sich nur um die Ansicht handelt. – Rachel
@Aaron, wenn Sie sich auf die Ansicht verlassen, um den MV zu generieren, dann denke ich, dass Sie feststellen werden, dass es MVVM nicht anhaftet :) –