Вопрос

Я пишу собственный объект 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); }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top