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


ли способ сделать атрибут «Browsable» условным, чтобы применяемое свойство иногда отображалось на странице свойств, а иногда нет?
Спасибо :)

Ответы на вопрос(5)

Решение Вопроса

Вы можете решить эту проблему, внедрив ICustomTypeDescriptor. Вот хорошая статья ореализация ICustomTypeDescriptor.

Или вы можете связать свой собственныйControlDesigner с вашим классом и переопределитьPreFilterProperties метод добавления или удаления свойств, просматриваемых в сетке свойств.

Удаление определенных свойств из сетки свойств.

 gg8905 дек. 2016 г., 05:59
ссылка на реализацию ICustomTypeDescriptor.got указала наmsdn.microsoft.com/magazine/msdn-magazine-issues Я думаю, что они удалили оригинальную страницу

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

    /// <summary>
    /// Set the Browsable property.
    /// NOTE: Be sure to decorate the property with [Browsable(true)]
    /// </summary>
    /// <param name="PropertyName">Name of the variable</param>
    /// <param name="bIsBrowsable">Browsable Value</param>
    private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable)
    {
        // Get the Descriptor's Properties
        PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName];

        // Get the Descriptor's "Browsable" Attribute
        BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
        FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);

        // Set the Descriptor's "Browsable" Attribute
        isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
    }

Затем вы также можете добавить версию, которая принимает экземпляр:

    /// <summary>
    /// Set the Browsable property.
    /// NOTE: Be sure to decorate the property with [Browsable(true)]
    /// </summary>
    /// <param name="obj">An instance of the object whose property should be modified.</param>
    /// <param name="PropertyName">Name of the variable</param>
    /// <param name="bIsBrowsable">Browsable Value</param>
    private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable)
    {
        SetBrowsableProperty<T>(strPropertyName, bIsBrowsable);
    }

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

    class Foo
    {
        [Browsable(false)]
        public string Bar { get; set; }
    }
    void Example()
    {
        SetBrowsableProperty<Foo>("Bar", true);
        Foo foo = new Foo();
        SetBrowsableProperty(foo, "Bar", false);
    }

что это применимо к вашей ситуации, но вы можете настроить «Browsable» оформление во время выполнения, вызвав функцию ниже.

/// <summary>
/// Set the Browsable property.
/// NOTE: Be sure to decorate the property with [Browsable(true)]
/// </summary>
/// <param name="PropertyName">Name of the variable</param>
/// <param name="bIsBrowsable">Browsable Value</param>
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable)
{
    // Get the Descriptor's Properties
    PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];

    // Get the Descriptor's "Browsable" Attribute
    BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
    FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);

    // Set the Descriptor's "Browsable" Attribute
    isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
}
 Nastaran Hakimi13 мар. 2019 г., 14:40
Я должен сказать, что ваше решение вызывает включение или отключение всех свойств, доступных для просмотра, что не является целью этого вопроса.
 Ganesh Kamath - 'Code Frenzy'15 мар. 2017 г., 09:44
Большое спасибо за ваше решение, я изменил строку наPropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(vObject.GetType())[strPropertyName‌​];где vObject - это объект, который я изменяю.
 Ganesh Kamath - 'Code Frenzy'15 мар. 2017 г., 07:32
Здравствуй. Я ищу что-то подобное. Когда я использую ваш код, я получаю исключение nullValue в первой строкеPropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];, Я хочу знать, где разместить эти функции и как это отражается на сетке свойств (не видел объект propertyGrid в функции).

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

Я устанавливаю символ условной компиляции (находится на вкладке «Построение» свойств проекта) IS_VIS (значение true, если вы хотите, чтобы отображались определенные элементы, false, если вы хотите скрыть их), а затем:

#if IS_VIS
    public const System.ComponentModel.EditorBrowsableState isVis =
        ComponentModel.EditorBrowsableState.Always;
#else
    public const System.ComponentModel.EditorBrowsableState isVis =
        ComponentModel.EditorBrowsableState.Never;
#endif

Затем вы ссылаетесь на переменную isVis в атрибуте:

[EditorBrowsable(isVis)]
public string myMethod...

Я сделал это в VB, и это было поспешно преобразовано в C #. Если что-то не работает, дайте мне знать.

самый простой уровень, вы можете предоставить пользовательскийTypeDescriptor для вашего типа, полученного изExpandableObjectConverterи просто включите / исключите данное свойство прихоти - но это работает только сPropertyGrid - используется страницей свойств. Более сложный подход заключается в использованииICustomTypeDescriptor / TypeDescriptionProvider - это может работать внутри таких вещей, какDataGridView

Ваш ответ на вопрос