2

Я пишу пользовательский объект DataGridView для крупного проекта, чтобы передать кучу разработчиков, чтобы наши разделы приложений выглядели согласованными.Перегрузка DataGridViewCellStyle и присвоение значения по умолчанию

Я хочу, чтобы установить значения по умолчанию для многих свойств 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 является классом, я не могу сделать из него постоянную. Я попытался изменить все настройки на то, что я хочу, чтобы они были в конструкторе классов, и это отлично работает, за исключением того, что изменения, внесенные в свойства конструктора, просто отбрасываются, как только приложение запускается. Поэтому внесение изменений в конструктор не будет.

Есть ли где-нибудь еще я могу поставить код, который запускается только тогда, когда элемент управления сначала отбрасывается на конструктор? или любым другим способом установки значения по умолчанию?

ответ

1

На самом деле, я подумал об этом некоторое время и наткнулся на более простое решение для моей проблемы. Это не работает для всех случаев, потому что он полагается на то, что человек, использующий настраиваемый компонент, скорее всего, никогда не захочет вернуть весь 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 

Просто идет, чтобы показать, как раз потому, что у вас есть золотой молоток, не означает, что каждая проблема является гвоздь.

+0

Правильно, это может быть винт. – broke

+0

Что-то вроде этого. – Jrud

2

Я столкнулся с этой проблемой. Мое решение работает вокруг требования, чтобы аргумент 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); } 
} 
Смежные вопросы