私はこのようなDataGridViewのからDataGridViewExクラスを派生trueに設定されています!私のコードはそれをどこにでも設定するわけではないので、 "誰か他の人"がtrueに設定します。もちろん、上記のコードは実行され、AutoGenerateColumnsは瞬時にfalseに設定されますが、後で "true"になります。のDataGridView AutoGenerateColumnsは何とか
アイデア?
私はこのようなDataGridViewのからDataGridViewExクラスを派生trueに設定されています!私のコードはそれをどこにでも設定するわけではないので、 "誰か他の人"がtrueに設定します。もちろん、上記のコードは実行され、AutoGenerateColumnsは瞬時にfalseに設定されますが、後で "true"になります。のDataGridView AutoGenerateColumnsは何とか
アイデア?
、ここで説明したように、私は、.NETのソースはデバッグの.NETフレームワークのことができるようにするために、ダウンロード:
http://referencesource.microsoft.com/serversetup.aspx
それから私はDataGridView.AutoGenerateColumnsプロパティにブレークポイントを入れて、それがシステムにtrueに設定されていることが分かりました。 Windows.Forms.Design.DataGridViewDesigner.Initialize()メソッド。
私は反射鏡で、この方法を開いて、次のことを見た:
public override void Initialize(IComponent component)
{
...
view.AutoGenerateColumns = view.DataSource == null;
...
}
ので、DataSourceがnullであるとして、初期化()メソッドがtrueにAutoGeneratedColumnsを設定:(
私はDataGridViewDesignerから私自身のデザイナーを導出したかったです適切にこの問題を解決する方法がないようにこの動作をオーバーライドするクラスが、DataGridViewDesignerが内蔵されているので、私はできません。
だから、そうです:(
残念ながら、これは予想されます。 AutogenerateColumns
をnew
と宣言しているため、その呼び出しは仮想化されません。親コードがAutogenerateColumns
からtrue
に設定されている場合、それはプロパティセッターに渡されません。これは行動に直接的な影響はありませんが(親の財産を延期するだけなので)はConsole.WriteLine(Environment.StackTrace)
やこれと似たようなことをすることができないため、デバッグの能力を制限します。セッター。
Reflectorのようなツールを使用してtrueに設定されている場所を探してみる必要がありますが、最も単純なシナリオでは問題になります(たとえば、親が直接バッキング変数を設定している)。値が設定されている場所を見つけるには、試行錯誤を実際に行う必要があります。次にコードをAutoGeneratedColumns = false;
と呼びます。私はOnCreateControl
をオーバーライドし、その値を開始点として調べます。
これは私にとっても問題でした。なんらかの理由で、AutogenerateColumnsプロパティの属性は[Browsable(false)]であるため、デザイナには表示されません。この問題を回避するには、DataGridViewコントロールを含むフォームのコンストラクターでAutogenerateColumns = Falseを設定してください。私はあなたがこれを行う限りのデータバインディングの前に、それが期待どおりに動作するはずだと思います。
私のソリューション非常に簡単です:OnAutoGenerateColumnsChanged
をオーバーライドすることによってAutoGenerateColumns
の変化を見て、それが不要だ場合、変更を元に戻す:
public class MyDataGridView : DataGridView
{
private bool mbAutoGenerateColumns = false;
[Browsable(true)]
[Category("Behavior")]
[DefaultValue(false)]
new public bool AutoGenerateColumns
{
get { return base.AutoGenerateColumns; }
set { base.AutoGenerateColumns = mbAutoGenerateColumns = value; }
}
public MyDataGridView()
{
// Set AGC to false right on the start
AutoGenerateColumns = false;
}
protected override void OnAutoGenerateColumnsChanged(EventArgs e)
{
base.OnAutoGenerateColumnsChanged(e);
// When AGC gets changed, check if the change happened
// internally or through the new property.
// If internally, revert!
// Since DGV has a tendency to enable AGC, only the setting
// to false is explicitly needed, the rest happens automatically
if(!mbAutoGenerateColumns && base.AutoGenerateColumns)
base.AutoGenerateColumns = false;
}
}
私はそれはかなりハックだけど、それが動作し、コントロールデザイナー以来 - 前に述べたように - 導出ではありませんそれは私が見つけることができる最高です。