Есть ли способ скрыть определенный столбец в DataGrid, когда AutoGenerateColumns = True? - PullRequest
24 голосов
/ 22 октября 2010

У меня есть таблица данных WPF 4.0, которая связана с таблицей данных с помощью AutoGenerateColumns = True.Столбцы являются динамическими, однако я знаю, что всегда будет столбец с именем ID, и я хотел бы скрыть этот столбец.Есть ли способ, которым я могу сделать это?

Ответы [ 5 ]

34 голосов
/ 22 октября 2010

в вашей таблице данных, подпишитесь на событие AutoGeneratingColumn, событие args (DataGridAutoGeneratingColumnEventArgs) имеет имя столбца и "Cancel", если имя столбца ID, тогда установите Cancel = true. должен сделать трюк.

9 голосов
/ 08 декабря 2015

Вы можете использовать поведение (повторно используемый код) для выполнения работы ... Таким образом, вы можете использовать атрибут, который бы централизовал видимость столбца в одном месте.

Использование:

<Window
...
 xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary">

<DataGrid ...
    extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True">

...

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

Код:

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

namespace HQ.Wpf.Util.Behaviors
{
    /// <summary>
    /// Using this behavior on a dataGRid will ensure to display only columns with "Browsable Attributes"
    /// </summary>
    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: 
                    // /2297106/est-li-sposob-skryt-opredelennyi-stolbets-v-datagrid-kogda-autogeneratecolumns-true
                    // I added few next lines:
                    var displayName = att as DisplayNameAttribute;
                    if (displayName != null)
                    {
                        e.Column.Header = displayName.DisplayName;
                    }
                }
            }
        }
    }
}
4 голосов
/ 09 мая 2014

Другая возможность будет 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;
        }
    }
1 голос
/ 22 октября 2010

Я не могу говорить за 4, однако это было невозможно в 3.5 SP1, по крайней мере без регистрации на событие, которое я хотел избежать любой ценой.

Вместо этого вы можете изменить код генерации на AutoGenerateColumns=False, а затем просто поместить интересующие вас столбцы в XAML, поскольку все базовые данные все равно будут соответствующим образом размещены в столбцах

            <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}"/>

Это позволит вам отображать только те столбцы, которые вас интересуют, относительно базовой модели, а также изменить Header на отображение по вашему усмотрению, чтобы вы не были привязаны к имени Property в модели..

0 голосов
/ 25 марта 2013

Я бы не сказал, что это отличное решение ... но ... у вас может быть еще один уровень абстракции например, допустим, у вас есть объект вроде:

public class Foo
{
    public string Id { get; set; }

    public string Property2 { get; set; }

    public string Property3 { set; get; }
}

Вам не нужен столбец для идентификатора, поэтому вы создаете новый объект

public class Foo2
{
    public string Property2 { get; set; }

    public string Property3 { set; get; }
}

затем сопоставьте / конвертируйте Foo в Foo2, и все готово.

Другой возможный способ (не всегда возможно) - изменить модификатор доступа на внутренний

public class Foo
{
    internal string Id { get; set; }

    public string Property2 { get; set; }

    public string Property3 { set; get; }
}

таким образом, у вас не будет сгенерированного столбца Id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...