過負荷DataGridViewCellStyleとデフォルト値を与えます
-
19-09-2019 - |
質問
私は我々のアプリのセクションに一貫性に見えるように、開発者の束に配るために大規模なプロジェクトのためのカスタムの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クラスがあるので、私はそれのうち一定にすることはできません。私は、彼らがクラスのコンストラクタになりたいものにすべての設定の変更を試してみた、そしてそれは、デザイナーのプロパティで行った変更は、単にアプリを実行するとすぐに戻って設定され得ることを除いて、素晴らしい作品。そうではないだろう、コンストラクタに変更を入れます。
私はコントロールが最初のデザイナーにドロップされたときにのみ実行されるコードを置くことができますどこにもありますか?デフォルトの設定のあるいは他の方法はありますか?
解決 2
実は、私はしばらくもはやそれについて考え、私の問題のための簡単なソリューションに出くわしました。それはカスタムコンポーネントを使用している人は、おそらく、Windowsのデフォルト設定に戻す全体CellStyleを元に戻したいことはありませんという事実に依存しているので、これはすべてのケースでは動作しません。私は、コンストラクタで、現在のものに新しい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
ちょうどあなたが黄金のハンマーを持っているからといって、すべての問題は、釘であることを意味するものではありません。
、を示すことを行きます他のヒント
私もこの問題に遭遇しました。私のソリューションは、コンパイル時定数であることをのDefaultValue引数のための要件を回避します。私は代わりに(C#で静的コンストラクタによって定義され、及びVBに共有コンストラクタ)クラスのコンストラクタに値を設定するのに十分ではない、と思った
このクラスのコンストラクタは、クラスのロード時に呼び出されるまで、それは実際にメタデータに存在しないので、それが壊れる可能性がある事例は、おそらくありますが、私の場合は仕事の周りに良いと思えるが、デザイナーのための許容されるべきである属性。 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); }
}