Sobrecarga DataGridViewCellStyle e dar um valor padrão
-
19-09-2019 - |
Pergunta
Eu estou escrevendo um objeto DataGridView personalizado para um grande projeto para entregar a um grupo de desenvolvedores para fazer nossas seções de aplicativos olhar consistente.
Eu quero define padrões para muitas das propriedades do DataGridView, e eu posso definir muitos deles assim:
<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
Estas propriedades sobrecarregar com seus padrões muito bem. Sua quando eu comecei a tentar fazer estilos de célula padrão que eu corri para a questão. Desde o DataGridViewCellStyle é uma classe, eu não posso fazer uma constante de fora. Eu tentei mudar todas as configurações para o que eu quero que eles sejam no construtor da classe, e que funciona muito bem, exceto que as alterações feitas nas propriedades de designer apenas se definir de volta assim que o aplicativo é executado. Então, colocar as mudanças no construtor não vai fazer.
Existe em qualquer outro lugar eu posso colocar o código que é executado somente quando o controle é primeiro caiu sobre o designer? ou qualquer outra forma de estabelecer um padrão?
Solução 2
Na verdade, eu pensei sobre isso um pouco mais e me deparei com uma solução simples para o meu problema. Isso não funciona para todos os casos, porque se baseia no fato de que a pessoa que usa o componente personalizado provavelmente nunca vai querer reverter toda uma volta CellStyle para os padrões do Windows. Eu acabei comparando uma nova CellStyle ao atual no construtor, e apenas definir o estilo se correspondido. Desta forma, ele não vai Substituir as alterações, mas vai configurá-lo pela primeira vez.
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
Só vai para mostrar, só porque você tem um martelo de ouro, não significa que todo problema é um prego.
Outras dicas
Eu corri para este problema também. Minha solução funciona em torno da exigência para o argumento DefaultValue ser uma constante em tempo de compilação. Eu pensei, não seria suficiente para definir o valor no construtor da classe (definido pelo construtor estático em C #, e o construtor compartilhado em VB) em vez?
Esta parece ser uma boa solução alternativa no meu caso, embora provavelmente há casos em que pode quebrar uma vez que não é realmente presente na meta-dados até que o construtor da classe é chamado de carregar a classe, mas para um Designer atributo que deverá ser aceitável. Porque DefaultValueAttribute.SetValue é protegido, eu tinha que definir uma classe derivada que torna pública.
Esta multa trabalha no designer, ele reconhece quando o valor é o mesmo que o padrão e omite-lo do código gerado quando possível, e só gera as diferenças em relação ao padrão.
Aqui está o código em C #, isso deve funcionar em VB também, mas eu não sou muito familiarizado com sua sintaxe, então eu vou ter que deixar isso para você.
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); }
}