Вопрос по c# – Сделать свойство видимым в DataGridView, но НЕ в PropertyGrid?

6

Допустим, у меня есть свойство, которое я хочу показать в DataGridView, но не тогда, когда тот же объект отображается в PropertyGrid. Я знаю, что могу использовать[Browsable(false)], но это скрывает это в обоих взглядах. Я также могу сделатьgridView.Columns["blah"].Visible = false;, но это противоположно тому, что я хочу, так как он скрывается в DataGridView, но не в PropertyGrid. Есть ли способ сделать обратное? (Если не считать создания новой таблицы DataTable просто для хранения одних и тех же данных за вычетом одного поля и привязки к ней всего - вместо этого это действительно удачный способ сделать что-то.) В качестве альтернативы я мог бы жить с решением, которое добавляет DataGridView, которого нет в фактическом классе.

Да, есть еще одна причина, по которой они не смогут это исправить, даже если это было исправление без поломок: WinForms не затрагивался с 2.0; Считается, что он был заменен WPF. Tergiver
Я приму их, когда они действительно ответят на мои вопросы. Половина моих вопросов едва ли имела какие-либо мнения, не говоря уже о хороших ответах Darrel Hoffman
Я называю это ошибкой.Browsable в частности говорится, что он определяет видимость члена в окне свойств. Это не имеет ничего общего с DGV. Вы можете открыть проблему с подключением, но вероятность того, что они это исправят, равна нулю. Исправление, несомненно, нарушит существующий код. Я думаю, что вам не повезло здесь. Tergiver
Черт. Конечно, они могли бы добавить новый декоратор вместо того, чтобы пытаться исправить Browsable, но все равно отстой, что это невозможно сделать. Вы могли бы подумать, что это не будет необычным запросом ... Darrel Hoffman

Ваш Ответ

1   ответ
6

Эту проблему можно решить с помощью свойства 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)

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededlooksError: User Rate Limit Exceeded Darrel Hoffman

Похожие вопросы