Pregunta

Estoy escribiendo un objeto DataGridView personalizado para un gran proyecto para entregar a un grupo de desarrolladores para hacer nuestras secciones de aplicaciones aspecto coherente.

Quiero establecer valores predeterminados para muchas de las propiedades del DataGridView, y puedo configurar muchos de ellos de esta manera:

<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 propiedades sobrecargan con sus valores predeterminados bien. Su cuando empecé a tratar de hacer Estilos de celda por defecto que me encontré con el problema. Desde el DataGridViewCellStyle es una clase, no puedo hacer una constante fuera de él. He intentado cambiar toda la configuración a lo que yo quiero que sean en el constructor de la clase, y que funciona muy bien, excepto que los cambios realizados en las propiedades de diseño acaba de conseguir el sistema tan pronto como se ejecuta la aplicación. Así que poner los cambios en el constructor no es suficiente.

¿Hay algún lugar más que pueda poner el código que sólo se ejecuta cuando el control se redujo por primera vez en el diseñador? o cualquier otra forma de establecer un defecto?

¿Fue útil?

Solución 2

En realidad, lo pensé un poco más y encontré una solución más simple para mi problema. Esto no funciona para todos los casos porque se basa en el hecho de que la persona que utiliza el componente personalizado probablemente nunca querer revertir una CellStyle toda la espalda a Windows por defecto. Terminé la comparación de una nueva CellStyle a la actual en el constructor, y sólo de seleccionar el estilo si satisfacía. De esta manera no va a sobrescribir los cambios, pero va a configurarlo por primera 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ólo sirve para demostrar, simplemente porque usted tiene un martillo de oro, no significa que cada problema es un clavo.

Otros consejos

Me encontré con este problema también. Mi solución funciona en torno a la exigencia para el argumento ValorPredeterminado a ser una constante en tiempo de compilación. Pensé, ¿no sería suficiente para establecer el valor en el constructor de la clase (definida por el constructor estático en C #, y el constructor compartida en VB) en lugar?

Esto parece ser una buena solución temporal en mi caso, aunque es probable que haya casos en los que se podría romper ya que no es realmente presente en el meta-datos hasta que el constructor de la clase se llama al cargar la clase, pero para un diseñador atributo que debería ser aceptable. Debido DefaultValueAttribute.SetValue está protegido, tuviera que definir una clase derivada que lo hace público.

Esto funciona bien en el diseñador, se reconoce cuando el valor es el mismo que el defecto y lo omite del código generado cuando sea posible, y sólo genera las diferencias con el valor predeterminado.

Este es el código en C #, esto debería funcionar también en VB, pero no estoy demasiado familiarizado con su sintaxis, así que tendrá que dejar que depende de usted.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top