2012-04-02 35 views
0

DatagridviewCell.Datagridviewプロパティは読み取り専用です。行と列のようなDatagridview参照を持つ他のdatagridview要素にも同じことが適用されます。しかし、何らかの形でDataGridViewから要素を追加/削除すると、このプロパティは背後で正しく設定されるため、親のDataGridViewの要素への参照と矛盾はありません。DataGridViewCell.Datagridviewプロパティはどのように設定されますか?

これはどのようにして達成されますか?私は似たようなことをやろうとしています。私が知っている唯一の "トリック"は、コレクション定義をクラス定義の中に入れたり、その逆にすることで、要素やコレクションが他のプライベートフィールドにアクセスできるようにしますが、datagridviewの名前空間を見ると、 。

答えて

0

DateGridViewは「内部」アクセス修飾子を使用しています。ご存じのとおり、4種類のアクセス修飾子があります。

public string MyPetPeeve 
private string MyPetPeeve 
protected string MyPetPeeve 
internal string MyPetPeeve 

はここでアクセス修飾子の振る舞いの簡単な要約です:

公共:MyPetPeeveが知りたい人にづけしています。

private:MyPetPeeveは、それを含むクラスまたは構造体からのみアクセスできます。

protected:MyPetPeeveは、それを含むクラスまたは構造体にアクセスできます。 PLUS、クラスを含むMyPetPeevesから派生した任意のクラス。

内部:MyPetPeeveは、同じアセンブリ内に存在するすべてのクラスまたは構造体にアクセスできます。たとえば、System.Windows.FormsアセンブリにDataGridViewが存在するため、System.Windows.Formsにあるクラスや構造体によってDatagridviewCell.Datagridviewプロパティが変更される可能性があります。 System.Windows.Forms以外の誰かに、この場合、あなたはプライベートであるようです。

+0

論理的に聞こえますが、少し奇妙です。親dgvと子要素の参照を互いに同期させておく必要があるため、Formsアセンブリ内で_anything_要素のdgvプロパティを変更できるようにすることはかなり広い範囲です。私はMSが明らかにアセンブリ全体をコントロールしているので、それは問題ないと思うが、追加のチェックが適切かどうか疑問に思う。 – Tekito

+0

これは本当に奇妙なことではありません。外部の開発者が見ることのできない素晴らしい制限されていないアクセスと引き換えに、開発者に同期化の負担をかけるだけです。ところで、このようなプロパティを定義している場合、public string Text {get;セット; }のように、 "set"をinternalにすることができます:public string Text {get;内部セット;} 「Under the hood」に行き、マイクロソフトがDataGridView用に作成したコードを参照するには、Red-GateのReflectorを使用できます。 www.reflector.net – RichardB

+0

開発者(および将来の開発者)が同期のルールを覚えている限り。しかし、おそらく、私のような最も良い解決策は、コレクションの定義の中で定義された抽象的な子クラスで、起動時にプライベート '_parentColl'フィールドの変更を可能にするデリゲート参照を渡します。この方法では、コレクション内の1つのデリゲートを除いて、子コレクションの参照はすべて非表示のままです。コレクションの参照は、子の追加/削除時に同期に使用されます。おそらく、おそらくあまりにも複雑です。 – Tekito

関連する問題