【问题标题】:Derive Two Extended Control One inside Another in C# ToolBox在 C# 工具箱中派生两个扩展控件一个内另一个
【发布时间】:2017-09-29 14:45:28
【问题描述】:

我的类库中有两个控件,一个名为 TextBox 和一个 Panel,我可以在我的 ToolBox 中以不同方式派生它们,但我想要的不是派生两个不同的控件,而是我希望我的文本框在面板中并仅派生面板使其包含面板和文本框。我在做这件事时遇到了一个问题。 Panel 在 Toolbox 中很容易使用,但我在 Panel 中创建的文本框对象不可见。谁能告诉我这件事可以实现吗?

public class TextBoxPanel :Panel
{
    TextBoxPanel()
    {
        IpTextBox ip = new IpTextBox();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
    }

    public class IPField : TextBox
    {
        protected override void OnClick(EventArgs e)
        {

        }
    }
}

【问题讨论】:

  • 至少您需要将文本框添加到面板中。例如Controls.Add(ip);
  • 我应该在哪里写这行? @yolosora
  • 例如在您的面板构造器中创建文本框后@himanshu
  • 我在构造函数中检查它不起作用,但是当我在 OnPaint() 方法中实例化时它以某种方式起作用。谢谢:)

标签: c# winforms controls


【解决方案1】:

您不能从多个基类进行扩展。您从Panel 得出的直觉是正确的,因为您希望TextBoxPanel 中。

最大的问题是为什么你“需要”从TextBox 派生?如果您只需要在您的新控件中添加一个TextBox,那么只需将它的一个实例添加到您的面板就足够了。

如果 TextBox 通过您希望从新的 TextBoxPanel 公开的 API 提供附加功能,那么我建议以下内容:

public interface ICoolStuff
{
   public String HelloWorld();
}

public class TextBox : Control, ICoolStuff
{
    // *snip*
}

public class TextBoxPanel : Panel, ICoolStuff
{
    public string HelloWorld()
    {
        return this.textbox.HelloWorld();
    }
}

如果你的文本框提供的功能不依赖于文本框本身,那么最好将它分成一个完全不同的类

【讨论】:

  • 这实际上是我定义了阴影效果的面板,所以我希望在我的文本框周围有阴影,这就是我选择将文本框放在面板中的原因。
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2017-12-11
  • 2010-10-27
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多