Я тоже столкнулся с этой проблемой. Мое решение работает вокруг требования, чтобы аргумент DefaultValue был константой времени компиляции. Я подумал, не будет ли достаточно установить значение в конструкторе класса (определенном статическим конструктором в C # и общим конструктором в VB) вместо этого?
В моем случае это хороший обходной путь, хотя, возможно, есть случаи, когда он может сломаться, поскольку он фактически не присутствует в метаданных, пока конструктор класса не будет вызван при загрузке класса, но для дизайнера атрибут, который должен быть приемлемым. Поскольку DefaultValueAttribute.SetValue защищен, мне пришлось определить производный класс, который делает его общедоступным.
Это прекрасно работает в конструкторе, распознает, когда значение совпадает со значением по умолчанию, и по возможности исключает его из сгенерированного кода, и генерирует только отличия от значения по умолчанию.
Вот код на C #, он должен работать и на VB, но я не слишком знаком с его синтаксисом, поэтому мне придется оставить это на ваше усмотрение.
public partial class HighlightGrid : DataGridView
{
// Class constructor
static MethodGrid()
{
// Get HighlightStyle attribute handle
DefaultValueSettableAttribute attr =
TypeDescriptor.GetProperties(typeof(HighlightGrid))["HighlightStyle"]
.Attributes[typeof(DefaultValueSettableAttribute)]
as DefaultValueSettableAttribute;
// Set default highlight style
DataGridViewCellStyle style = new DataGridViewCellStyle();
style.BackColor = Color.Chartreuse;
attr.SetValue(style);
}
[DefaultValueSettable, Description("Cell style of highlighted cells")]
public DataGridViewCellStyle HighlightStyle
{
get { return this.highlightStyle; }
set { this.highlightStyle = value; }
}
// ...
}
// Normally the value of DefaultValueAttribute can't be changed and has
// to be a compile-time constant. This derived class allows setting the
// value in the class constructor for example.
public class DefaultValueSettableAttribute : DefaultValueAttribute
{
public DefaultValueSettableAttribute() : base(new object()) { }
public new void SetValue(Object value) { base.SetValue(value); }
}