【问题标题】:How does DataGridViewCell.Datagridview property get set?DataGridViewCell.Datagridview 属性如何设置?
【发布时间】:2012-04-16 05:21:27
【问题描述】:

DatagridviewCell.Datagridview 属性是只读的。这同样适用于具有Datagridview 引用的其他datagridview 元素,例如行和列。然而不知何故,当您从 datagridview 添加/删除元素时,此属性在幕后正确设置,因此父 datagridview 对其元素的引用之间永远不会有任何不一致,反之亦然。

datagridview 是如何做到这一点的?我正在尝试自己做类似的事情。我知道的唯一“技巧”是将集合定义放在类定义中,反之亦然,以便元素或集合可以访问其他的私有字段,但是查看 datagridview 命名空间似乎并非如此.

【问题讨论】:

    标签: .net oop collections datagridview


    【解决方案1】:

    DateGridView 正在使用“内部”访问修饰符。您可能知道,有 4 种不同的访问修饰符。

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

    以下是访问修饰符行为的简要总结:

    公开:任何想知道的人都可以访问 MyPetPeeve。

    private:MyPetPeeve 只能从包含它的类或结构中访问。

    protected: MyPetPeeve 可以被包含它的类或结构访问。另外,任何派生自包含类的 MyPetPeeves 的类。

    internal:MyPetPeeve 可被同一程序集中存在的任何类或结构访问。例如,DataGridView 存在于 System.Windows.Forms 程序集中,因此在 System.Windows.Forms 中找到的任何类或结构都可以更改 DatagridviewCell.Datagridview 属性。对于 System.Windows.Forms 之外的任何其他人,在这种情况下:您,它似乎是私有的。

    【讨论】:

    • 这听起来合乎逻辑,虽然有点奇怪。由于父 dgv 和子元素对彼此的引用必须保持同步,因此允许 Forms 程序集中的 anything 更改元素的 dgv 属性的范围相当广泛。我想这没关系,因为 MS 显然控制了整个程序集,但我想知道是否有额外的检查。
    • 这并不奇怪,它只是将同步的负担放在了开发人员身上,以换取外部开发人员甚至看不到的一些美妙的不受限制的访问。顺便说一句,如果您要定义这样的属性: public string Text { get;放; },您可以像这样将“设置”设置为内部: public string Text {get;内部集;}。如果您想“深入了解”并查看 Microsoft 为 DataGridView 编写的代码,您可以使用 Red-Gate 的 Reflector。 www.reflector.net
    • 只要开发者(以及未来的开发者)记住同步规则。但也许最好的解决方案,因为我的有点复杂:在集合定义中定义一个抽象子类,在启动时传递集合一个委托引用,允许修改其私有 _parentColl 字段。这样一来,除了集合中的一个委托之外,一个孩子的集合引用对所有人都是隐藏的,它用于在添加/删除孩子时进行同步。可能过于复杂。
    猜你喜欢
    • 2018-11-13
    • 2021-12-03
    • 1970-01-01
    • 2011-07-07
    • 2014-03-11
    • 2019-10-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多