Сделать свойство видимым в DataGridView, но НЕ в PropertyGrid?
Допустим, у меня есть свойство, которое я хочу показать в DataGridView, но не тогда, когда тот же объект отображается в PropertyGrid. Я знаю, что могу использовать [Browsable(false)]
, но это скрывает это в обоих взглядах. Я также могу сделать gridView.Columns["blah"].Visible = false;
, но это противоположно тому, что я хочу, так как он скрывается в DataGridView, но не в PropertyGrid. Есть ли способ сделать обратное? (Если не считать создания новой таблицы DataTable просто для хранения одних и тех же данных за вычетом одного поля и привязки всего к этому вместо этого - это действительно удачный способ сделать что-то.) В качестве альтернативы, я мог бы жить с решением, которое добавляет столбец в DataGridView. это не присутствует на фактическом классе.
1 ответ
Эту проблему можно решить с помощью свойства BrowsableAttributes PropertyGrid. Сначала создайте новый атрибут, подобный этому:
public class PropertyGridBrowsableAttribute : Attribute
{
private bool browsable;
public PropertyGridBrowsableAttribute(bool browsable){
this.browsable = browsable;
}
}
Затем добавьте этот атрибут ко всем тем свойствам, которые вы хотите показать в вашей PropertyGrid:
[DisplayName("First Name"), Category("Names"), PropertyGridBrowsable(true)]
public string FirstName {
get { return ... }
set { ... }
}
Затем установите свойство BrowsableAttributes следующим образом:
myPropertyGrid.BrowsableAttributes = new AttributeCollection(
new Attribute[] { new PropertyGridBrowsableAttribute(true) });
Это покажет только приписанные свойства в вашей сетке свойств, и DataGridView все еще может получить доступ ко всем свойствам с помощью лишь немного больше усилий по написанию кода.
Я бы все-таки пошел с Tergiver и назвал это поведение ошибкой, поскольку документация по атрибуту Browsable четко заявляет о его использовании только для окон свойств.
(Кредит предоставляется пользователю "maro" по адресу http://www.mycsharp.de/wbb2/thread.php?postid=234565)