我想创建文本框的子类,以便我可以在其中添加我想要的行为。我首先尝试通过向项目添加项目的视觉路线,选择常用控件并将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-在当前上下文中不存在”。
所以这不是真正好的解决方案。
有什么帮助吗?
答案 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所述的步骤进行操作。