如何在表单中引用子类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
类的OnKeyPress
方法并调用基类实现。所以用这个方法替换你的keypressed
方法。
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if (e.KeyChar == (char)Keys.Return)
{
//Do the work...
}
}
要使此控件出现在工具箱中,只需构建项目,下次您应该在列表中看到它并能够将其拖到窗体上。如果这不起作用,请按照dknaack的答案中描述的步骤进行操作。