Programación WPF, una breve descripción de cómo ocultar algunas columnas o realizar otras operaciones cuando el control DataGrid genera columnas automáticamente

El control DataGrid puede optar por declarar manualmente los campos que se mostrarán y los títulos correspondientes, o puede generar columnas automáticamente después de vincular la fuente de datos.
Pero en el modo automático, el encabezado de la columna es el nombre del campo y se generan todas las columnas de la fuente de datos. Si se requieren ciertos juicios y operaciones en modo automático, aquí hay un posible método eficaz.

1. Ocultar algunas columnas

Utilice el evento AutoGeneratingColumn de DataGrid para filtrar columnas no deseadas al generar columnas.

Interfaz:

<DataGrid>  
	ItemsSource="{Binding 数据源列表}"  
	AutoGenerateColumns="True" 
	AutoGeneratingColumn="gridWC_AutoGeneratingColumn" > 
</DataGrid>

Entre bastidores:

private void gridWC_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
 {
    
    
	if (e.Column.Header.ToString()=="字段一" || e.Column.Header.ToString() == "字段二" ||  e.Column.Header.ToString() == "字段三")
	{
    
    
	e.Cancel = true;
	}
  }

2. Explicación

DataGrid proporciona dos eventos relacionados con columnas generadas automáticamente, a saber:

AutoGeneratingColumn : Se levantará cuando se cree la columna para cada atributo. Cuando se levanta, se ha creado la columna. En este caso, se puede:

  • Obtenga el objeto de columna creado a través de e.Column y modifíquelo.
  • Descarte la columna estableciendo e.Cancel en verdadero.
  • Si no establece e.Cancel en verdadero, DataGrid agregará inmediatamente la columna a las Columnas después del evento.
  • A través de e.PropertyDescriptor, puede saber por qué el atributo está creando actualmente la columna y la información detallada del atributo, incluido el conjunto de atributos que pertenece al atributo.

AutoGeneratedColumns : se generará cuando se complete la creación de columnas para todos los atributos.

3. Ajustar el orden de las columnas

La idea es la siguiente: compartir programas , compartir código fuente

  • Cree un atributo personalizado que se pueda utilizar en el atributo, que contiene un valor para indicar la posición de la columna creada automáticamente para el atributo en relación con todas las columnas.

  • En el evento AutoGeneratingColumn :

    • Establezca e.Cancel en true para que DataGrid piense que todas las columnas creadas automáticamente han sido canceladas (abandonadas).
    • Lea el atributo personalizado a través de e.PropertyDescriptor y extraiga la información de ubicación de él.
    • Guarde la información de ubicación y los objetos de columna.
    • Ordene el conjunto de columnas guardadas en el evento AutoGeneratedColumns y luego agréguelas todas a DataGrid.Columns en orden

3.1 El código de implementación principal

    internal class DemoViewModel
    {
    
    
        #region ColumnOrder

        //使用 DataGridColumnOrderAttribute 设置自动生成列的顺序
        //Use the DataGridColumnOrderAttribute to set the order in which columns are automatically generated

        [DataGridColumnOrder(3)]
        public string ColumnA {
    
     get; set; }

        [DataGridColumnOrder(2)]
        public bool ColumnB {
    
     get; set; }

        [DataGridColumnOrder(1)]
        public DateTime ColumnC {
    
     get; set; }

        #endregion ColumnOrder

        //使用 DisplayNameAttribute 设置自动生成列的显示名称
        //Use DisplayNameAttribute to set the display name(Header) of the automatically generated column
        [DisplayName("The DisplayName :)")]
        public string ColumnD {
    
     get; set; }

        //使用 DoNotAutoGenerateDataGridColumnAttribute 阻止自动生成列
        //Block auto generate column with DoNotAutoGenerateDataGridColumnAttribute
        [DoNotAutoGenerateDataGridColumn]
        public string ColumnE {
    
     get; set; }

        public static List<DemoViewModel> GetDemoList() => new List<DemoViewModel>()
        {
    
    
            new DemoViewModel()
            {
    
    
                ColumnA="DemoItem1",
                ColumnB =true,
                ColumnC =DateTime.Now
            }
        };
    }
    /// <summary>
    /// 指定属性在System.Windows.Controls.DataGrid中自动生成列时,列的顺序
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class DataGridColumnOrderAttribute : Attribute
    {
    
    
        public static readonly DataGridColumnOrderAttribute Default = new DataGridColumnOrderAttribute(0);

        public DataGridColumnOrderAttribute(int order)
        {
    
    
            DataGridColumnOrderValue = order;
        }

        public virtual int DataGridColumnOrder => DataGridColumnOrderValue;

        protected int DataGridColumnOrderValue {
    
     get; set; }

        public override bool Equals(object obj)
        {
    
    
            if (obj == this)
            {
    
    
                return true;
            }

            return obj is DataGridColumnOrderAttribute other && other.DataGridColumnOrder == DataGridColumnOrder;
        }

        public override int GetHashCode()
        {
    
    
            return DataGridColumnOrder.GetHashCode();
        }

        public override bool IsDefaultAttribute()
        {
    
    
            return Equals(Default);
        }
    }
    public class DataGridEx : DataGrid
    {
    
    
        private List<ColumnAndOrder> _columnAndOrderList = new List<ColumnAndOrder>();

        public DataGridEx()
        {
    
    
            AutoGeneratingColumn += DataGridEx_AutoGeneratingColumn;
            AutoGeneratedColumns += DataGridEx_AutoGeneratedColumns;
        }

        private void DataGridEx_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
    
    
            //将创建过程标记为已取消,以阻止DataGrid将生成的列对象加入到列集合中.
            //Set event to cancel,DataGrid will not add current column to the Columns collection.
            e.Cancel = true;

            //从Attribute中读取显示名称.
            //Read display name from Attribute.
            var displayName = ((System.ComponentModel.MemberDescriptor)e.PropertyDescriptor).DisplayName;
            if (!string.IsNullOrWhiteSpace(displayName))
            {
    
    
                e.Column.Header = displayName;
            }

            //从Attribute中读取顺序,以及是否自动生成列的标识.
            //Read order from Attribute and whether to automatically generate column.
            var attributes = ((System.ComponentModel.MemberDescriptor)e.PropertyDescriptor).Attributes;
            var order = 0;
            foreach (Attribute attribute in attributes)
            {
    
    
                if (attribute is DataGridColumnOrderAttribute orderAttribute)
                {
    
    
                    order = orderAttribute.DataGridColumnOrder;
                }
                else if (attribute is DoNotAutoGenerateDataGridColumnAttribute)
                {
    
    
                    //发现 DoNotAutoGenerateDataGridColumnAttribute 时,丢弃已生成的列
                    //Discard generated column when DoNotAutoGenerateDataGridColumnAttribute is found
                    return;
                }
            }

            //将创建的列及顺序保存
            //Save the column and order
            _columnAndOrderList.Add(new ColumnAndOrder(order, e.Column));
        }

        private void DataGridEx_AutoGeneratedColumns(object sender, EventArgs e)
        {
    
    
            //按顺序将所有列加入到Columns集合中
            //Add all columns to the Columns collection in order
            foreach (var columnAndOrder in _columnAndOrderList.OrderBy(v => v.Order))
            {
    
    
                Columns.Add(columnAndOrder.DataGridColumn);
            }

            //不需要了
            //No longer useful
            _columnAndOrderList = null;
        }

        private class ColumnAndOrder
        {
    
    
            public ColumnAndOrder(int order, DataGridColumn dataGridColumn)
            {
    
    
                Order = order;
                DataGridColumn = dataGridColumn;
            }

            public int Order {
    
     get; }

            public DataGridColumn DataGridColumn {
    
     get; }
        }
    }

Supongo que te gusta

Origin blog.csdn.net/qq_43307934/article/details/109034794
Recomendado
Clasificación