Изменение значения DefaultValue свойства унаследованного элемента управления .net

StackOverflow https://stackoverflow.com/questions/163611

Вопрос

В .net у меня есть унаследованный элемент управления:

public CustomComboBox : ComboBox

Я просто хочу изменить значение по умолчанию свойства DropDownStyle на другое значение (ComboBoxStyle.DropDownList) помимо значения по умолчанию, указанного в базовом классе (ComboBoxStyle.DropDown).

Можно подумать, что вы можете просто добавить конструктор:

public CustomComboBox()
{
     this.DropDownStyle = ComboBoxStyle.DropDownList;
}

Однако этот подход может сбить с толку Visual Studio Designer. При разработке пользовательского элемента управления в Visual Studio, если вы выбираете ComboBoxStyle.DropDown для DropDownStyle, он считает, что выбранное вами свойство все еще является значением по умолчанию (из [DevaultValue ()] в базовом классе ComboBox), поэтому оно не добавьте строку customComboBox.DropDownStyle = ComboBoxStyle.DropDown в файл Designer.cs. И достаточно запутанно, вы обнаружите, что экран не работает должным образом после запуска.

Ну, вы не можете переопределить свойство DropDownStyle, так как оно не является виртуальным, но вы можете сделать это:

[DefaultValue(typeof(ComboBoxStyle), "DropDownList")]
public new ComboBoxStyle DropDownStyle
{
      set { base.DropDownStyle = value; }
      get { return base.DropDownStyle; }
}

но тогда вы столкнетесь с неприятностями из-за нюансов использования " new " деклараций. Я попробовал это, и это, кажется, не работает должным образом, поскольку дизайнер визуальной студии запутывается и из-за этого подхода и вынуждает ComboBoxStyle.DropDown (по умолчанию для базового класса).

Есть ли другой способ сделать это? Извините за подробный вопрос, его сложно описать подробно.

Это было полезно?

Решение

Похоже, это работает.

public class CustomComboBox : ComboBox
{
    public CustomComboBox()
    {
        base.DropDownStyle = ComboBoxStyle.DropDownList;
    }

    [DefaultValue(ComboBoxStyle.DropDownList)]
    public new ComboBoxStyle DropDownStyle
    {
        set { base.DropDownStyle = value; Invalidate(); }
        get { return base.DropDownStyle;}
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top