Frage

Ich schreibe ein benutzerdefinierte Datagridview-Objekt für ein großes Projekt zu einer Reihe von Entwicklern, die Hand aus, um unsere App Abschnitte konsistent aussehen.

Ich mag Standardeinstellung für viele der Eigenschaften des Datagridview, und ich kann so viele von ihnen setzen:

<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

Überlastung Diese Eigenschaften mit ihren Standardeinstellungen gut. Sein, wenn ich versuche gestartet Standardzellen Stile zu machen, dass ich in das Problem lief. Da die DataGridViewCellStyle eine Klasse ist, kann ich nicht eine konstante draus machen. Ich habe versucht, alle Einstellungen zu ändern, was ich möchte, dass sie im Konstruktor der Klasse sein, und das funktioniert gut, außer dass in den Designer-Eigenschaften vorgenommenen Änderungen nur zurück, sobald die App läuft fertig. die Änderungen im Konstruktor nicht tun, so setzen.

Gibt es irgendwo anders kann ich Code setzen, dass nur ausgeführt, wenn die Steuerung zuerst auf dem Designer fallen gelassen wird? oder jede andere Art und Weise eine Standard der Einstellung?

War es hilfreich?

Lösung 2

Eigentlich dachte ich darüber noch eine Weile und kam in eine einfachere Lösung für mein Problem. Dies gilt nicht für alle Fälle funktionieren, weil es beruht auf der Tatsache, dass die Person, die die benutzerdefinierte Komponente verwendet wird wahrscheinlich nie eine ganzen Cellstyle zurück zum Fenster Voreinstellungen zurücksetzen will. Ich landete einen neuen Cellstyle auf dem aktuellen im Konstruktor bis zu vergleichen und nur die Einstellung der Stil, wenn sie abgestimmt. Auf diese Weise wird es nicht überschreiben Änderungen, aber es wird es zum ersten Mal eingerichtet.

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

Just geht zu zeigen, nur weil Sie einen goldenen Hammer haben, bedeutet nicht, dass jedes Problem ein Nagel ist.

Andere Tipps

Ich lief in diesem zu Problem. Meine Lösung arbeitet rund um die Voraussetzung für das Default Argument ein Kompilierung-Konstante zu sein. Ich dachte, es würde nicht ausreichen, um den Wert im Konstruktor der Klasse zu setzen (definiert durch den statischen Konstruktor in C # und den gemeinsamen Konstruktor in VB) statt?

Das scheint eine gute Work-around in meinem Fall zu sein, obwohl es wahrscheinlich Fälle, in denen es brechen könnte, da ist es nicht tatsächlich in den Meta-Daten, bis die Klasse Konstruktor beim Laden der Klasse aufgerufen wird, aber für einen Designer Attribut, das akzeptabel sein sollte. Da DefaultValueAttribute.SetValue geschützt ist, ich hatte eine abgeleitete Klasse zu definieren, die es öffentlich macht.

Dies funktioniert im Designer, erkennt es, wenn der Wert der gleiche wie der Standard ist und unterlässt es aus dem generierten Code, wenn möglich, und erzeugt nur die Unterschiede zur Standard.

Hier ist der Code in C #, sollte dies auch in VB arbeiten, aber ich bin nicht allzu vertraut mit der Syntax, damit ich, dass bei Ihnen verlassen muß.

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); }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top