Изменение значения DefaultValue свойства унаследованного элемента управления .net - PullRequest
10 голосов
/ 02 октября 2008

В .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; }
}

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

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

1 Ответ

9 голосов
/ 02 октября 2008

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

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;}
    }
}
...