2

私は、大規模なプロジェクト用のカスタム DataGridView オブジェクトを作成して、多数の開発者に配布して、アプリ セクションの一貫性を確保しています。

DataGridView の多くのプロパティのデフォルトを設定したいのですが、それらの多くを次のように設定できます。

<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

これらのプロパティは、デフォルトで問題なくオーバーロードされます。問題に遭遇したのは、デフォルトのセルスタイルを作成しようとし始めたときです。DataGridViewCellStyle はクラスであるため、定数を作成することはできません。すべての設定をクラス コンストラクターで希望する設定に変更しようとしましたが、アプリが実行されるとすぐに、デザイナー プロパティで行われた変更が元に戻されることを除けば、うまく機能します。したがって、変更をコンストラクターに入れることはできません。

コントロールがデザイナーに最初にドロップされたときにのみ実行されるコードを配置できる場所は他にありますか? またはデフォルトを設定する他の方法はありますか?

4

2 に答える 2

2

私もこの問題に遭遇しました。私のソリューションは、DefaultValue 引数がコンパイル時の定数であるという要件を回避します。代わりに、クラス コンストラクター (C# の静的コンストラクターと VB の共有コンストラクターによって定義される) に値を設定するだけで十分ではないかと思いました。

私の場合、これは良い回避策のようですが、クラスのロード時にクラスコンストラクターが呼び出されるまで実際にはメタデータに存在しないため、おそらく壊れる可能性がありますが、必要な Designer 属性の場合受け入れられる。DefaultValueAttribute.SetValue は保護されているため、それをパブリックにする派生クラスを定義する必要がありました。

これはデザイナで正常に機能し、値がデフォルトと同じであることを認識し、可能な場合は生成されたコードから省略し、デフォルトとの違いのみを生成します。

これは C# のコードです。これは VB でも機能するはずですが、私はその構文にあまり詳しくないので、それはあなたに任せる必要があります。

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); }
}
于 2010-11-09T10:06:58.780 に答える
1

実際、私はそれについてもう少し考えて、私の問題に対するより簡単な解決策に出くわしました. これは、カスタム コンポーネントを使用しているユーザーが CellStyle 全体を Windows のデフォルトに戻したいとは思わないという事実に依存しているため、すべてのケースで機能するわけではありません。コンストラクターで新しい CellStyle を現在のものと比較し、一致した場合にのみスタイルを設定することになりました。この方法では、変更が上書きされることはありませんが、最初に設定されます。

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

金のハンマーを持っているからといって、すべての問題が釘であるとは限りません。

于 2010-02-10T21:18:44.670 に答える