如何在ToolBox上放置扩展的WinForms控件

时间:2009-07-12 16:05:57

标签: c# winforms

我计划使用以下内容向TextBox添加功能:

   public class TextBoxExt : TextBox  
    {
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
        }

    }

问题是我们如何使用这个TextBoxExt?反正有没有把这个类放到ToolBox上,以便我们可以将它拖放到表单上?如果没有,使用TextBoxExt的最佳方法是什么?

8 个答案:

答案 0 :(得分:15)

  1. 使用TextBoxExt构建项目,确保编译好。
  2. 使用您希望TextBoxExt打开的表单,打开工具箱,右键单击并选择“选择项目”
  3. 浏览您在1)
  4. 中编译的.exe或dll
  5. 确保TextBoxExt旁边有一个勾号,按ok
  6. TextBoxExt应出现在工具箱中,将其拖到表单上
  7. (还有另一种方法,打开设计器文件并将TextBox的实例重命名为TextBoxExt,但有些人认为手工编辑设计器文件是危险的)

答案 1 :(得分:7)

我知道这是一个非常古老的问题,但对于像我这样有同样问题的其他人来说可能仍然有用 - 因为它仍然位于Google的顶层:)

您可能会对使用ToolboxItemAttribute(http://msdn.microsoft.com/en-us/library/system.componentmodel.toolboxitemattribute(v=vs.110).aspx)感兴趣。

我在最后解决了这个问题。

[ToolboxItem(true)]
public class PanelTitle : LabelControl  {
   // Whatever code to override LabelControl here...
}

重建解决方案,扩展控件应显示在工具箱中。

答案 2 :(得分:3)

项目中的任何自定义控件都应自动显示在工具箱中。我发现在关闭重新打开的Visual Studio之前,有时控件不会显示。我认为这个问题与缓存工具箱内容有关。

答案 3 :(得分:0)

您需要在派生类中添加构造函数。

public class TextBoxExt : TextBox      
{        
    public TextBoxExt()
    {
    }

    protected override void OnKeyPress(KeyPressEventArgs e)        
    {            
         base.OnKeyPress(e);        
    }    
}

答案 4 :(得分:0)

您的控件应自动显示在解决方案的工具箱中。要让它出现在其他项目中,您必须像其他人所说的那样选择工具箱项目。

如果您想提供特殊的设计时功能,那么您还需要提供一些额外的设计器相关属性,可能还需要从ControlDesigner派生自己的类。

答案 5 :(得分:0)

几个小时前我就陷入了这个陷阱 我有一个带有一些自定义UserControls的.NET 2.0 Windows应用程序项目;它工作得很好。 所以我决定在子文件夹中订购我的文件,以使我的项目更清洁一点 之后,Visual Studio 2010设计器停止加载我的表单,ToolBox将不再显示我的控件 我吓坏了,移回项目根目录中的源文件,重置ToolBox,但似乎没有任何工作。 在那之后,我记得我使用了ReSharper“删除未使用的引用”,所以我尝试放回未使用的引用,特别是 System.Data :问题解决了! :o
我不能说你为什么,但这对我有用 希望我的经验可以帮助别人。 :)
再见, 南多

答案 6 :(得分:0)

我为UltraGridBagLayoutPanel的自定义实现创建了一个空构造函数。虽然david.healed是正确的,但是没有必要,在表单初始化时使用断点来检查是否正在使用您的类实现自定义控件是非常有用的。

编辑设计器文件要容易得多,但我尝试了它并更改了控件的字段类型,并将字段的分配更改为自定义控件的新实例。

private Infragistics.Win.Misc.UltraGridBagLayoutPanel ultraGridBagLayoutPanel1;
this.ultraGridBagLayoutPanel1 = new Infragistics.Win.Misc.UltraGridBagLayoutPanel();

private Athia.Reports.ultraGridBagLayoutPanel1 ultraGridBagLayoutPanel1;
this.ultraGridBagLayoutPanel1 = new Athia.Reports.ultraGridBagLayoutPanel1();

这样做每次都会破坏Visual Studio并修复它需要使用文本编辑器将其重新放回。因此,除非有人能够描述我对这种方法的实现有什么问题,否则调用类与控件名称相同并不是一个好主意,我认为实现这一目标的唯一安全可靠的方法是Calanus在步骤1中描述的当Rob Windsor正确地指出重新启动时,VS会自动将控件带入工具箱。不幸的是,我必须将所有子控件从原始类更改为我的自定义类: - (。

答案 7 :(得分:0)

在同一个解决方案中,这应该会自动生效。但是,我发现如果目标框架不匹配,则工具箱不会填充。 (我假设参考需要的版本与Reference的目标相同或更低。)(我确实得到了关于不匹配框架的警告) 通过使这些相同的目标框架,重新编译,重新启动VS.控件正确填充。 (我还添加了ToolboxItem(true)属性)