Saltar al contenido

¿Hay alguna forma de ocultar una columna específica en un DataGrid cuando AutoGenerateColumns=True?

Necesitamos tu ayuda para difundir nuestros enunciados referente a las ciencias de la computación.

Solución:

en su cuadrícula de datos, suscríbase a la AutoGeneratingColumn evento, el evento args (DataGridAutoGeneratingColumnEventArgs) tiene el nombre de la columna y un “Cancel“, si el nombre de la columna es ID, establezca Cancel = true. debería hacer el truco.

Puede usar un comportamiento (código reutilizable) para hacer el trabajo… De esta manera puede usar attribute lo que centralizaría la visibilidad de la columna en un solo lugar.

Uso:




public class YourObjectItem
{
    [Browsable(false)]
        public Assembly Assembly  get; set; 

Código:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace HQ.Wpf.Util.Behaviors

    /// 
    /// Using this behavior on a dataGRid will ensure to display only columns with "Browsable Attributes"
    /// 
    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;
                        
                    

                    // As proposed by "dba" stackoverflow user on webpage: 
                    // https://stackoverflow.com/questions/4000132/is-there-a-way-to-hide-a-specific-column-in-a-datagrid-when-autogeneratecolumns
                    // I added few next lines:
                    var displayName = att as DisplayNameAttribute;
                    if (displayName != null)
                    
                        e.Column.Header = displayName.DisplayName;
                    
                
            
        
    

Otra posibilidad seria 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;
        
    

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *