我的winform中有四个文本框,我已经按顺序订购了它们的标签索引。另外,我将TabStop
属性设置为true
。但是当我在填充第一个文本框时按Tab
键时,它不会移动到下一个文本框。为此,我甚至在代码中为每个部分添加了以下部分:
firstTextbox.KeyDown += (sender, args) =>
{
if(args.KeyCode == Keys.Tab)
{
firstTextbox.SelectNextControl(this, true, true, true, true);
}
}
但这也没有帮助。有什么建议吗?
答案 0 :(得分:1)
响应标签按钮由消息循环处理。如果您将表单作为模式运行,或正在调用
Application.Run(myForm);
然后你有一个消息循环。如果你只做
Form myForm = new Form();
myForm.Visible = true;
然后你没有消息循环,因此标签导航不起作用。 (如果您没有以模态方式运行表单,请尝试使用ShowDialog()方法显示表单,并查看tabbing是否适用于此情况。)
如果这是您的问题,那么下面的MSDN文章建议您
https://msdn.microsoft.com/en-us/library/ms229591(v=vs.110).aspx
我在将表单上的KeyPreview设置为true,然后在Form.OnKeyDown方法中侦听System.Windows.Forms.Keys.Tab(以及设置KeyEventArgs.SuppressKeyPress和如果我处理它,KeyEventArgs.Handled为true)。 (还记得检查KeyEventArgs.Modifiers属性以查看用户是否正在执行[Shift] + [Tab]。)这样做的缺点是你抢夺了有机会响应按键的控件,因为Form.KeyPreview使表单在控件获得机会之前有机会处理该键。 (我也不确定如果你实现了这个逻辑会发生什么和让消息循环继续。)
对于检测Tab键时应该执行的操作,请查看Control.SelectNextControl函数。我一直称它为...
e.SuppressKeyPress = SelectNextControl(
ActiveControl, //Current Control
true, //Move Forward? (You want false for a Shift-Tab to go backwards.)
true, //Only stop at controls where Control.TabStop == true?
true, //Consider controls nested within other controls?
true); //Wrap to the beginning of the form if you reach the end?
比我聪明的人可能能够建立共享的消息循环或其他东西,但这是我迄今为止所想的全部。
答案 1 :(得分:0)
Windows窗体应用程序中的每个控件都具有属性
this.button1.TabIndex = 3;
如果您正确订购,可以使用它来选择下一个控件。
答案 2 :(得分:0)
如果您的文本框是多行的,则需要将AcceptsTab属性设置为false。
答案 3 :(得分:0)
也许你的事件处理程序没有被注册。确保文本框不是ReadOnly = true,TabStop = false。试试这个
public Form1()
{
InitializeComponent();
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
textBox1.SelectNextControl(sender as Control, true, true, true, true);
}
}
答案 4 :(得分:0)
我能够使用Tab键触发textBox1_KeyDown
的唯一方法是覆盖IsInputKey
方法。
class TabTextBox : TextBox
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Tab)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == Keys.Tab)
{
this.SelectedText = " ";
}
else
{
base.OnKeyDown(e);
}
}
然后修改InitializeComponent():
private void InitializeComponent()
{
...
this.textBox1 = new TabTextBox();
...
}
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx
答案 5 :(得分:0)
我遇到类似的问题,完全忽略了Tab键顺序。经过两个小时的挖掘,我终于找到了我的愚蠢错误:"如果mybutton.Focus那么......"当我的意思是"如果myButton.Focused然后......"。哎呀。如果其他人也有这种经历,我想分享。