如何在表单中引用子类textbox

本文关键字:引用 子类 textbox 表单 | 更新日期: 2023-09-27 18:15:32

我想创建文本框的子类,以便我可以在其中添加我想要的行为。我第一次尝试视觉路径是在项目中添加项目,选择常用控件,并从工具箱中拖动文本框到设计视图。但是,当我试图将新类从工具箱"未能加载工具箱项"拖动到表单时,这给了我错误。所以我尝试在代码中创建子类。我创建了新的cs文件ZControls,以包括所有未来的子类控件,并在其中创建了新的txtbox类,并添加了一些代码来改变用户按Enter时的行为。

 class Ztextbox : TextBox
 {
        private void keypressed(Object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                this.SelectNextControl((Control) sender, true, true, true, true);
             }
         }
    }

它工作了,新的Ztxtbox控件在工具箱中,我成功地把它放在表单上。但它没有改变行为,当我按Enter时什么也没有发生。所以我猜我不能包含的代码可能是罪魁祸首

TextBox tb = new TextBox();
this.Controls.Add(tb);
tb.KeyPress += new KeyPressEventHandler(keypressed);

,但是在这个例子中,文本框是在表单类中创建的,它不像我那样拖拽,而且它没有在自己的cs文件中子类化。我怎么让它工作?


好的,我得到它的工作,但不是我的方法按键。我通过设计视图做到了这一点,在那里我单击ZtextBox并在其KeyPress事件中按Enter键,因此IDE为KeyPress创建了新事件,我将代码放在那里,它工作了。覆盖KeyPressEvent的代码被自动添加到表单的InitializeComponent()方法中:this.txtUsername.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtUsername_KeyPress); 我试图在上面的EventHandler插入我的方法,但错误是"名称-按下键-不存在于当前上下文中"。所以这不是一个很好的解决方案,只是一个变通的办法。任何帮助吗?

如何在表单中引用子类textbox

就第一个例子而言,您可能应该覆盖TextBox类的OnKeyPress方法并调用基类实现。所以用这个方法替换你的keypressed方法。

protected override void OnKeyPress(KeyPressEventArgs e)
{
   base.OnKeyPress(e);
   if (e.KeyChar == (char)Keys.Return)
   {
      //Do the work...
   }
}

要使此控件出现在工具箱中,只需构建项目,下次您应该在列表中看到它并能够将其拖到窗体上。如果这不起作用,请按照dknaack的答案中描述的步骤进行操作。