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?

Foi útil?

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); }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top