2

J'écris un objet DataGridView personnalisé pour un grand projet à distribuer à un groupe de développeurs pour que nos sections d'applications soient cohérentes.Surcharge DataGridViewCellStyle et donne une valeur par défaut

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. C'est quand j'ai commencé à essayer de créer des styles de cellule par défaut que j'ai rencontré dans le problème. Puisque DataGridViewCellStyle est une classe, je ne peux pas en faire une constante. J'ai essayé de changer tous les paramètres en fonction de ce que je veux qu'ils soient dans le constructeur de la classe, et cela fonctionne très bien, sauf que les changements apportés aux propriétés du concepteur sont remis à zéro dès que l'application fonctionne. Donc, mettre les changements dans le constructeur ne fera pas.

Y a-t-il d'autres endroits où je peux mettre du code qui ne fonctionne que lorsque le contrôle est abandonné pour la première fois sur le concepteur? ou toute autre façon de définir un défaut?

Répondre

1

En fait, j'y ai réfléchi un peu plus longtemps et j'ai trouvé une solution plus simple à mon problème. Cela ne fonctionne pas dans tous les cas, car il repose sur le fait que la personne qui utilise le composant personnalisé ne voudra probablement jamais rétablir les valeurs par défaut d'une valeur CellStyle entière. J'ai fini par comparer un nouveau CellStyle à l'actuel dans le constructeur, et seulement définir le style si elles correspondaient. De cette façon, il ne remplacera pas les modifications, mais il le configurera 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 

Juste va montrer, Juste parce que vous avez un marteau d'or, ne signifie pas que chaque problème est un ongle.

+0

À droite, ce pourrait être une vis. – broke

+0

Quelque chose comme ça. – Jrud

2

J'ai également rencontré ce problème. Ma solution contourne l'exigence pour l'argument DefaultValue d'être une constante à la compilation. Je pensais, ne serait-ce pas suffisant pour définir la valeur dans le constructeur de classe (défini par le constructeur statique dans C#, et le constructeur partagé dans VB) à la place? Cela semble être une bonne solution dans mon cas, mais il y a probablement des cas où il pourrait casser car il n'est pas présent dans les méta-données jusqu'à ce que le constructeur de la classe soit appelé lors du chargement de la classe, mais pour un Attribut de concepteur qui devrait être acceptable. Parce que DefaultValueAttribute.SetValue est protégé, j'ai dû 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 celle par défaut et l'omet dans la mesure du possible du code généré, et ne génère que les différences par défaut.

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

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); } 
}