如何以

时间:2016-10-28 09:51:12

标签: c# winforms

我想创建文本框的子类,以便我可以在其中添加我想要的行为。我首先尝试通过向项目添加项目的视觉路线,选择常用控件并将txtbox从工具箱拖到设计视图。但是当我尝试将新类从工具箱“无法加载工具箱项”拖到窗体时,这给了我错误。 所以我试着在代码中创建子类。我创建了新的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文件中进行子类化。 我如何让它工作?

好的,我得到它的工作但不是我的方法keypressed。我通过设计视图完成了它,我点击了ZtextBox并在其KeyPress事件中按Enter键,因此IDE为KeyPress创建了新事件,我放置了我的代码并且它工作正常。重写KeyPressEvent的代码是自动添加到表单InitializeComponent()方法中: this.txtUsername.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtUsername_KeyPress); 我试图在上面的EventHandler中插入我的方法,但错误是“名称-keypressed-在当前上下文中不存在”。 所以这不是真正好的解决方案。 有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

就第一个示例而言,您应该覆盖OnKeyPress类的TextBox方法并调用基类实现。因此,请将此keypressed方法替换为此方法。

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

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