【问题标题】:How to put an extended WinForms Control on ToolBox如何在工具箱上放置一个扩展的 WinForms 控件
【发布时间】:2009-07-12 16:05:56
【问题描述】:

我打算为 TextBox 添加以下功能:

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

    }

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:
    1. 使用 TextBoxExt 构建项目,确保编译正常。
    2. 使用您想要 TextBoxExt 的表单,打开工具箱,右键单击并选择“选择项目”
    3. 浏览到您在 1) 中编译的 .exe 或 dll
    4. 确保TextBoxExt旁边有勾号,按ok
    5. TextBoxExt 应该出现在工具箱中,将其拖到您的表单上

    (还有另一种方法,打开设计器文件并将 TextBox 的实例重命名为 TextBoxExt,但手动编辑设计器文件可能被某些人认为是危险的)

    【讨论】:

    • 我做了很多扩展控件,这是将它们添加到表单的方法。此外,您还可以将该项目添加到您当前的解决方案中,并将对您项目 (TextBoxExt) 的 dll 的引用添加到您计划在其中使用 TextBoxExt 的项目中。
    • 添加对 dll(控件库)的引用并没有自动将控件添加到 Visual Studio 的工具箱中,执行第二步“选择项目”>>浏览>>选择 dll 中的技巧我的情况。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 另外,请确保您的项目/解决方案能够构建。
      【解决方案4】:

      你需要给你的派生类添加一个构造函数。

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

      【讨论】:

      • 抱歉,我只是在没有添加构造函数的情况下尝试了它,并且我的工作正常。不太清楚它是如何不自动控制控件的。
      • 这是因为如果源代码中没有明确定义构造函数,VS 会在构建过程中自动为类添加默认构造函数。但是如果你定义一个带参数的构造函数,它不会这样做,那么你也需要添加一个显式的默认构造函数。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我为 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 中描述的到 5 或与 Rob Windsor 正确指出的小偏差,重新启动 VS 将自动将控件带入工具箱。不幸的是,我必须将所有子控件从原始类更改为我的自定义类:-(。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2023-03-06
              • 1970-01-01
              • 2017-09-29
              • 2018-03-14
              • 2021-09-05
              • 2011-05-23
              • 2011-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多