【问题标题】:Overriding Controls property of a panel in C#在 C# 中覆盖面板的 Controls 属性
【发布时间】:2008-10-24 12:50:58
【问题描述】:

我必须重写从窗口的面板控件扩展的 myControl 的“控件”属性的 Add 方法。为此,我将 ControlCollection 类扩展为 MyControlCollection,并在其中覆盖了它的 Add 方法。现在我声明了一个 MyControlCollection 类型的 Controls 属性来隐藏面板的 Controls 属性。当我访问 this.Controls.Add(control) 时,它指的是重写的 Add 方法。但是,如果我在 myControl 上拖放一个控件,则行为属于基本类型的 Add 方法。任何机构都可以提出这个问题的原因和补救措施吗?提前致谢。

【问题讨论】:

    标签: c# windows .net-2.0


    【解决方案1】:

    您可以改为覆盖 CreateControlCollection 函数,并返回您选择的类的实例,该实例继承 System.Web.UI.ControlCollection。 从您的类中删除 Controls 属性,您不需要覆盖或隐藏原始实现。

    【讨论】:

    • 哦,很好 - 我没有意识到这一点。如果可能的话,我想我仍然会尝试首先不需要我自己的 ControlCollection,但很高兴知道它可以做到:)
    • windows中没有这种可覆盖的控制方法。
    • 对不起,我的错...我猜我读你的帖子有点太快了,还以为你在 ASP.NET 上下文中。但是,在 Windows 窗体中,您可以通过重写 CreateControlsInstance 函数来做同样的事情。
    【解决方案2】:

    原因是设计者正在调用 Control.Controls 而不是访问您的单独集合。老实说,您的解决方案听起来注定会造成麻烦 - 隐藏成员通常会。

    您到底想达到什么目标? ControlCollection 中似乎没有什么好事件可以挂钩,但可能有不同的方法来解决这个问题。

    编辑:我刚刚看到 Control 有一个 ControlAdded 事件 - 订阅它对你来说就足够了吗?

    【讨论】:

    • 我必须根据某些属性限制在 myControl 中添加控件。 ControlAdded 在位置 0,0 的父级中添加新控件后触发。之后,它将控件重新定位到所需位置。如果我在 ControlAdded 的 EventHandler 中从父级移除该新控件,则会发生异常。
    【解决方案3】:

    实际上,如果某些标志为真,我必须限制在我的控件中添加控件。我使用了那个 ControlAdded 事件,但它只增加了问题。 ControlAdded 仅在父级中的位置 0、0 处添加该控件后才会触发。在引发该事件后,它会在放置时根据鼠标位置重新定位控件。如果我在 ControlAdded 的 EventHandler 异常中从父级删除该新控件。

    【讨论】:

    • 老话题,但你有没有找到解决方案?我还想限制添加到面板的控件。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多