2009-07-12 58 views
9

我计划的功能添加到文本框与以下:如何把一个扩展的WinForms控制上的工具箱

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

    } 

的问题是我们如何使用这个TextBoxExt?无论如何要把这个类放到工具箱上,这样我们可以将它拖放到表单上?如果没有,使用TextBoxExt的最佳方式是什么?

回答

14
  1. 用TextBoxExt建立你的项目,确保它编译好。
  2. 与窗体要在TextBoxExt,打开工具箱,点击右键,选择“选择项”
  3. 浏览到您的.exe或者.dll文件,你在1编译)
  4. 确保TextBoxExt有蜱在它旁边,按OK
  5. TextBoxExt应该出现在工具箱中,将其拖动到窗体

(有这样做,打开设计文件和重命名文本框的实例TextBoxExt但手工的另一种方式编辑设计器文件可能会被认为是有害的)

+0

我已经做了很多扩展的控制,这就是将它们添加到表单的方式。您还可以将该项目添加到当前的解决方案中,还可以将对项目dll的引用(TextBoxExt)添加到您计划使用TextBoxExt的项目中。 – 2009-07-13 06:10:01

3

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

+0

另外,确保您的项目/解决方案建立。 – 2011-02-17 21:26:53

0

您需要为派生类添加一个构造函数。

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

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

不是。没有构造函数也是如此。 – 2009-07-13 08:03:18

0

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

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

0

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

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的每一次,并修复它需要使用文本编辑器把它放回去一次。因此,除非任何人能够描述我实施这种方法时出现了什么问题,或许将这个类与控制名称相同并不是一个好主意,我认为唯一安全可靠的方法就是卡拉努斯在步骤1到5或者与之稍有偏差,因为Rob Windsor正确地指出,重新启动VS会自动将控制器带入工具箱。不幸的是我,我则不得不改变所有的孩子从原来的类控制了我的定制类:-(。

6

我知道这是超级老问题,但也许还是为别人有喜欢同样的问题有用我 - 因为它仍然在顶部谷歌:)

您可能会感兴趣使用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... 
} 

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

0

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