Question

J'écris un objet DataGridView personnalisé pour un grand projet à distribuer à un groupe de développeurs pour que nos sections d'applications semblent cohérentes.

Je veux définir les valeurs par défaut pour la plupart des propriétés du DataGridView, et je peux mettre beaucoup d'entre eux comme ceci:

<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

Ces propriétés surcharge avec leurs valeurs par défaut très bien. Son quand je commencé à essayer de faire des styles de cellule par défaut que je suis tombé sur la question. Étant donné que le DataGridViewCellStyle est une classe, je ne peux pas faire une constante hors de lui. Je l'ai essayé de changer tous les paramètres à ce que je veux qu'ils soient dans le constructeur de la classe, et qui fonctionne très bien, sauf que les modifications apportées dans les propriétés du concepteur juste se préparent dès que les pistes app. Donc, mettre les changements dans le constructeur ne fera pas.

Y at-il nulle part ailleurs je peux mettre le code qui ne fonctionne que lorsque le contrôle est d'abord tombé sur le concepteur? ou de toute autre façon de définir une valeur par défaut?

Était-ce utile?

La solution 2

En fait, je pensais à ce sujet un peu plus longtemps et est tombé sur une solution plus simple pour mon problème. Cela ne fonctionne pas pour tous les cas car elle repose sur le fait que la personne qui utilise le composant personnalisé voudra probablement jamais de revenir un CellStyle tout le dos aux paramètres par défaut Windows. J'ai fini par comparer un nouveau CellStyle à celui en cours dans le constructeur, et la mise seulement le style si elles correspondent. De cette façon, il ne sera pas écraser les modifications, mais il redresserai la première fois.

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

Va juste montrer, simplement parce que vous avez un marteau d'or, ne signifie pas que chaque problème est un clou.

Autres conseils

Je courais trop ce problème. Ma solution fonctionne autour de l'exigence de l'argument DefaultValue être une constante de compilation. Je pensais que, ne serait-il suffisant pour définir la valeur dans le constructeur de la classe (définie par le constructeur statique en C #, et le constructeur partagé en VB) à la place?

Cela semble être un bon travail autour dans mon cas, mais il y a des cas probablement où il pourrait casser, car il est pas présent dans la méta-données jusqu'à ce que le constructeur de la classe est appelée lors du chargement de la classe, mais pour un concepteur attribuer cela devrait être acceptable. Parce que DefaultValueAttribute.SetValue est protégé, je devais définir une classe dérivée qui le rend public.

Cela fonctionne très bien dans le concepteur, il reconnaît lorsque la valeur est la même que la valeur par défaut et il omet de le code généré lorsque cela est possible, et ne génère que les différences par rapport la valeur par défaut.

Voici le code en C #, cela devrait fonctionner en VB aussi, mais je ne suis pas trop familier avec sa syntaxe, donc je vais devoir laisser cela à vous.

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); }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top