Перегрузите DataGridViewCellStyle и укажите значение по умолчанию.
-
19-09-2019 - |
Вопрос
Я пишу собственный объект DataGridView для большого проекта, чтобы раздать его группе разработчиков, чтобы разделы нашего приложения выглядели согласованно.
Я хочу установить значения по умолчанию для многих свойств DataGridView, и многие из них я могу установить следующим образом:
<System.ComponentModel.Browsable(True), System.ComponentModel.DefaultValue(DataGridViewAutoSizeColumnsMode.Fill)>_
Public Overloads Property AutoSizeColumnsMode() As DataGridViewAutoSizeColumnMode
Get
Return MyBase.AutoSizeColumnsMode
End Get
Set(ByVal value As DataGridViewAutoSizeColumnMode)
MyBase.AutoSizeColumnsMode = value
End Set
End Property
Эти свойства прекрасно перегружаются со значениями по умолчанию.Когда я начал пытаться создать стили ячеек по умолчанию, я столкнулся с проблемой.Поскольку DataGridViewCellStyle — это класс, я не могу сделать из него константу.Я попробовал изменить все настройки в конструкторе класса на те, которые я хочу, и это отлично работает, за исключением того, что изменения, внесенные в свойства дизайнера, просто возвращаются обратно, как только приложение запускается.Поэтому внесение изменений в конструктор не подойдет.
Есть ли еще где-нибудь, где я могу разместить код, который запускается только тогда, когда элемент управления впервые переносится на дизайнер?или любой другой способ установить значение по умолчанию?
Решение 2
На самом деле, я подумал об этом немного дольше и нашел более простое решение моей проблемы.Это работает не во всех случаях, поскольку основано на том факте, что человек, использующий пользовательский компонент, скорее всего, никогда не захочет вернуть весь CellStyle обратно к настройкам Windows по умолчанию.В итоге я сравнил новый CellStyle с текущим в конструкторе и установил стиль только в том случае, если они совпадают.Таким образом, он не перезапишет изменения, но настроит их с первого раза.
Public Class CustomDataGridView
Inherits System.Windows.Forms.DataGridView
Private RowStyle As New DataGridViewCellStyle
Public Sub New()
RowStyle.BackColor = Color.FromArgb(223, 220, 200)
RowStyle.Font = New Font("Arial", 12.75, FontStyle.Bold, GraphicsUnit.Point)
RowStyle.ForeColor = Color.Black
RowStyle.SelectionBackColor = Color.FromArgb(94, 136, 161)
If MyBase.RowsDefaultCellStyle.ToString = (New DataGridViewCellStyle).ToString Then
MyBase.RowsDefaultCellStyle = RowStyle
End If
End Sub
End Class
Просто показывает: то, что у вас есть золотой молоток, не означает, что каждая проблема — это гвоздь.
Другие советы
Я тоже столкнулся с этой проблемой.Мое решение работает вокруг требования, чтобы аргумент DefaultValue был константой времени компиляции.Я подумал, не будет ли вместо этого достаточно установить значение в конструкторе класса (определяемом статическим конструктором в C# и общим конструктором в VB)?
В моем случае это кажется хорошим обходным путем, хотя, вероятно, есть случаи, когда он может сломаться, поскольку он фактически не присутствует в метаданных до тех пор, пока конструктор класса не будет вызван при загрузке класса, но для атрибута Designer, который должен быть приемлемым.Поскольку 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); }
}