Domanda

Sto scrivendo un oggetto DataGridView personalizzato per un grande progetto di consegnare a un gruppo di sviluppatori per rendere le nostre sezioni app aspetto uniforme.

Voglio impostare i valori predefiniti per molte delle proprietà della DataGridView, e posso impostare molti di loro in questo modo:

<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

Queste proprietà sovraccaricare con i loro valori di default bene. La sua quando ho iniziato cercando di fare stili di cella di default che ho incontrato il problema. Dal momento che il DataGridViewCellStyle è una classe, non posso fare una costante fuori di esso. Ho provato a cambiare tutte le impostazioni a quello che voglio che siano nel costruttore della classe, e che le grandi opere, se non che le modifiche apportate nelle proprietà di design solo da impostare al più presto le piste app. Quindi, mettendo i cambiamenti nel costruttore non lo farà.

C'è altrove posso inserire il codice che viene eseguito solo quando il controllo viene prima lasciato cadere sul designer? o qualsiasi altro modo di impostare un default?

È stato utile?

Soluzione 2

In realtà, ho pensato un po 'più a lungo e mi sono imbattuto in una soluzione più semplice per il mio problema. Questo non funziona per tutti i casi perché si basa sul fatto che la persona che utilizza il componente personalizzato sarà probabilmente mai voglia di tornare un intero CellStyle indietro a Windows di default. Ho finito per confronto di un nuovo CellStyle a quella attuale nel costruttore, e l'impostazione solo lo stile se abbinati. In questo modo non sovrascrivere le modifiche, ma sarà configurarlo la prima volta.

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 solo a dimostrare, Solo perché si ha un martello d'oro, non vuol dire che ogni problema è un chiodo.

Altri suggerimenti

Mi sono imbattuto in questo problema anche. La mia soluzione funziona in tutto il requisito per l'argomento DefaultValue essere una costante fase di compilazione. Ho pensato, non sarebbe sufficiente per impostare il valore nel costruttore della classe (definito dal costruttore statico in C #, e il costruttore condiviso in VB), invece?

Questo sembra essere un buon lavoro-around nel mio caso, anche se probabilmente ci sono casi in cui si potrebbe rompere dato che non è effettivamente presente nella meta-dati fino a quando il costruttore della classe è chiamato il caricamento della classe, ma per un progettista attributo che dovrebbe essere accettabile. Perché DefaultValueAttribute.SetValue è protetto, ho dovuto definire una classe derivata che lo rende pubblico.

Questo funziona bene nella finestra di progettazione, si riconosce quando il valore è lo stesso che il difetto ed omette dal codice generato quando possibile, e genera solo le differenze da quello predefinito.

Ecco il codice in C #, questo dovrebbe funzionare in VB troppo, ma io non sono eccessivamente familiarità con la sua sintassi quindi dovrò lasciare che a voi.

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); }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top