Есть ли атрибут, который я могу использовать в своем классе, чтобы указать DataGridView не создавать для него столбец при привязке к List‹MyClass›

У меня есть такой класс:

private class MyClass {
  [DisplayName("Foo/Bar")]
  public string FooBar { get; private set; }
  public string Baz { get; private set; }      
  public bool Enabled;
}

Когда я создаю List<MyClass> и назначаю его DataSource из DataGridView, сетка показывает мне два столбца: «Foo/Bar» и «Baz». Это то, что я хочу, чтобы произошло.

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

Я бы тоже хотел сделать Enabled свойством, но все же скрыть его в DataGridView.

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

Есть ли атрибут, похожий на DisplayName, которым я могу пометить свойство? Что-то вроде [Visible(false)] ?


person Blorgbeard    schedule 01.07.2009    source источник


Ответы (2)


[Browsable(false)] скрывает свойство от DataGridView.

Визуальный дизайнер обычно отображает в окне свойств те элементы, которые либо не имеют атрибута просмотра, либо помечены параметром просмотра конструктора BrowsableAttribute, для которого задано значение true. Эти члены могут быть изменены во время разработки. Элементы, помеченные параметром просмотра конструктора BrowsableAttribute, для которого задано значение false, не подходят для редактирования во время разработки и поэтому не отображаются в визуальном конструкторе. Значение по умолчанию верно.

person C-Pound Guru    schedule 01.07.2009
comment
Забавно, на мой взгляд, [Bindable(false)] должен работать, а Browsable (согласно справке) определяет только то, отображается ли свойство в PropertyGrid. Но Bindable(false) игнорируется DataGridView. - person Jürgen Steinblock; 01.07.2009
comment
Я согласен, но после прочтения (и повторного прочтения) Руководства по разработке фреймворка (amazon.com/Framework-Design-Guidelines-Conventions-Development/), я обнаружил, что дизайнеры не всегда следовали собственным правилам (и иногда делали вещи, которые не имели смысла). - person C-Pound Guru; 01.07.2009
comment
Все эти элементы управления используют System.ComponentModel.PropertyDescriptor и, следовательно, используют одну и ту же логику для включения/исключения элементов. Классы ComponentModel можно настраивать, но это редкость, потому что это очень много работы. - person Ben Voigt; 18.06.2012

Я был в блаженном неведении о том, что атрибуты декоратора System.ComponentModel, такие как BrowsableAttribute и его родственники, были связаны с чем-то другим, кроме привязки к PropertyGrid. (facepalm) Мне нравится подход C-Pound Guru, потому что он позволяет сделать ваш графический интерфейс более слабо связанным, чем то, что я делал в прошлом.

Просто для другой точки зрения подход, который я использовал в течение длительного времени, заключается в предварительном определении столбцов в вашем DataGridView либо программно, либо с помощью конструктора форм. Когда вы сделаете это, вы можете установить DataPropertyName каждого столбца на имя вашего свойства. Единственный трюк заключается в том, что вам нужно установить для свойства AutoGenerateColumns DataGridView значение false, иначе DGV полностью проигнорирует ваши столбцы, созданные вручную. Обратите внимание, что по какой-то причине свойство AutoGenerateColumns скрыто из сетки свойств конструктора форм... понятия не имею, почему. Единственное преимущество, которое я вижу в этом подходе, заключается в том, что вы можете предварительно установить форматирование столбца и тому подобное — вам не нужно привязываться, а затем настраивать параметры рендеринга/размера столбца.

Вот пример того, что я имею в виду:

_DGV.AutoGenerateColumns = false;
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = "FooBar";
textColumn.HeaderText = "Foo/Bar"; // may not need to do this with your DisplayNameAttribute
_DGV.Columns.Add(textColumn);
textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = "Baz";

List<MyClass> data = GetMyData();
_DGV.DataSource = data;
person Yoopergeek    schedule 01.07.2009
comment
Я рад видеть, что я не единственный, кто лишен доступа к свойству AutoGenerateColumns через конструктор форм. - person Derek W; 02.10.2014
comment
Я бы определенно посчитал это лучшим ответом. Одна единственная строка кода, которая выполняет всю работу вместо рефакторинга всех моих пользовательских классов.... - person Daniel Möller; 28.05.2018