Список привязки объектов к объекту WinForms DataGridView, но не отображает некоторые общедоступные свойства - PullRequest
8 голосов
/ 13 марта 2010

Я даже не уверен, правильно ли я это делаю. Но в основном у меня есть список объектов, которые построены из класса. Оттуда я связываю список с представлением таблицы данных в форме Windows (C #)

Оттуда отображаются все открытые свойства объекта в виде сетки данных. Однако есть некоторые свойства, которые мне все еще нужны, чтобы быть доступными из других частей моего приложения, но на самом деле не обязательно быть видимыми в DataGridView.

Так есть ли атрибут или нечто подобное, что я могу написать над свойством, чтобы исключить его из показа.

P.S. Я обязываю во время выполнения. Поэтому я не могу редактировать столбцы через дизайнер.

P.P.S. Пожалуйста, не отвечайте просто на обнародование переменных (хотя, если это единственный способ, дайте мне знать :)).

Ответы [ 4 ]

14 голосов
/ 13 марта 2010

Добавьте атрибут [Browsable(false)] к открытым свойствам, для которых вы не хотите создавать столбец.

2 голосов
/ 13 марта 2010

Я должен был ответить так же, как @Vivek говорит в своем комментарии. Не знаю, почему он не добавил здесь ответ ...

Хорошо, если вы позволите элементу управления DataGridView автоматически генерировать его столбцы, он покажет все свойства в связанных объектах. Итак, прежде всего, вы должны включить DataGridView.AutoGenerateColumns = false.

Затем вы можете добавлять столбцы во время выполнения. Например:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn();
myColumn.DataPropertyName.HeaderText = "Title of the column";
myColumn.DataPropertyName = "NameOfTheProperty";

//...

MyDataGridView.Columns.Add(myColumn);
0 голосов
/ 03 февраля 2011

Я знаю, что это немного старый пост, но просто для ясности хочу добавить, что этого также можно добиться путем определения пользовательского определения типа с использованием интерфейса ICustomTypeDescriptor . Это выглядит немного больше работы, но вы можете реализовать только то, что вам нужно (в данном случае GetProperties). Позже это упростит задачу, поскольку большинство перечисленных столбцов автоматических сеток / списков поддерживают этот подход.

0 голосов
/ 13 марта 2010

В дополнение к моему предыдущему ответу, поскольку вы предпочитаете указывать не добавлять столбцы вручную, я предлагаю вам еще один вариант: использование пользовательских атрибутов в определении ваших свойств .

Сначала вы должны закодировать свой пользовательский атрибут:

MyPropertyAttribute class

[AttributeUsage(AttributeTargets.Property)]
public class MyPropertyAttribute : Attribute
{
    public enum VisibilityOptions
    {
        visible,
        invisible
    }

    private VisibilityOptions visibility = VisibilityOptions.visible;

    public MyPropertyAttribute(VisibilityOptions visibility)
    {
        this.visibility = visibility;
    }

    public VisibilityOptions Visibility
        {
            get
            {
                return visibility;
            }
            set
            {
                visibility = value;
            }
        }
}

Вы можете использовать его в своих классах, вот так:

класс Foo

public class Foo
{
    private string name;
    private string surname;

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)]
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)]
    public string Surname
    {
        get
        {
            return surname;
        }
        set
        {
            surname = value;
        }
    }

}

Вы можете написать метод, который выполняет итерацию свойств в ваших связанных объектах, используя отражение, и проверяет, помечены ли они как видимые или невидимые, чтобы добавлять или не добавлять столбцы. Вы можете даже иметь собственный DataGridView с таким поведением, поэтому вам не придется повторять это каждый раз. Вы можете использовать только свой собственный DataGridView и пометить видимость в свойствах.

Как то так ...

public class MyCustomDataGridView : DataGridView
    {

        public MyCustomDataGridView()
        {
            this.AutoGenerateColumns = false;
        }

        public void Load<T>(ICollection<T> collection)
        {

            foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true))
            {
                if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible)
                {
                    //...
                }
            }

        }

    }
...