none
控件的TabIndex和TabStop的问题 RRS feed

  • 问题

  • 我布置的场景是这样的

    正方的是PictureBox,只用于承载图像,下面的矩形是TextBox,运行时图像已在,让第一TextBox准备显示键盘按下,而且只收一个字母,自动跳到第二个TextBox,以此类推,8个完成换一批。

    TabIndex和TabStop有什么作用?


    • 已编辑 czhch 2019年8月20日 1:07
    2019年8月20日 0:59

答案

  • 控件的TabIndex主要用于全键盘操作时,通过Tab键切换控件的焦点

    TabStop是控制用户能否使用 Tab 键将焦点放到该控件上



    ericzhou

    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年8月22日 8:09
  • Hi,

    通过Tab键只是切换焦点所在的控件,并不会触发TextChanged事件。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年8月23日 1:35
    版主
  • 也可以用TextBox的Select方法,实现焦点的切换。

    代码如下,思路这个样,可以做适当的优化。

            private void textBox_TextChanged(object sender, EventArgs e)
            {
                List<TextBox> textBoxes = new List<TextBox>() {this.textBox1, this.textBox2, this.textBox3 };
                int idx = textBoxes.IndexOf(sender as TextBox);
                if(idx < textBoxes.Count - 1)
                {
                    textBoxes[idx + 1].Select();
                }
            }


    • 已编辑 朋友的朋友 2019年9月4日 6:36 图片未上传
    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年9月4日 6:35

全部回复

  • Hi,

    TabIndex的作用是设定按下Tab键时控件之间切换的顺序。参考文档如何:设置 Windows 窗体上的 Tab 键顺序

    TabStop属性用于设置Tab键是否可以将焦点放在该控件上。参考文档Control.TabStop Property

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年8月20日 1:54
    版主
  • 启动时光标已在TextBox1待命,

    因为它们有且仅有一个英文字母,

    private void TextBox_textChanged(object sender,EventArgs e)
    {
    
    }
    
    要做的事就是有一个字母了(即触发TextChanged)就光标转到下一个(接字母的是下一个)。光标转到下一个的代码???
    2019年8月21日 5:53
  • Hi,

    你可以使用“SendKeys”去模拟按下Tab键来切换TextBox。

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.TextChanged += TextBox_textChanged;
            textBox2.TextChanged += TextBox_textChanged;
            textBox3.TextChanged += TextBox_textChanged;
            textBox4.TextChanged += TextBox_textChanged;
            textBox5.TextChanged += TextBox_textChanged;
            textBox6.TextChanged += TextBox_textChanged;
        }
    
        private void TextBox_textChanged(object sender, EventArgs e)
        {
            SendKeys.Send("{tab}");
        }

    测试结果如下,

    你想要实现的是这种效果吗?如果有误解,请详细说明。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年8月21日 6:08
    版主
  • 控件的TabIndex主要用于全键盘操作时,通过Tab键切换控件的焦点

    TabStop是控制用户能否使用 Tab 键将焦点放到该控件上



    ericzhou

    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年8月22日 8:09
  • 如果用TabIndex,需要逐个控件顺序设置TabIndex的值,这样Tab才可以在控件上切换焦点

    ericzhou

    2019年8月22日 8:10
  • 是的,谢谢。但我有一丝疑问,添上<tab>会不会触发文本变动事件?
    2019年8月23日 1:16
  • Hi,

    通过Tab键只是切换焦点所在的控件,并不会触发TextChanged事件。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年8月23日 1:35
    版主
  • 也可以用TextBox的Select方法,实现焦点的切换。

    代码如下,思路这个样,可以做适当的优化。

            private void textBox_TextChanged(object sender, EventArgs e)
            {
                List<TextBox> textBoxes = new List<TextBox>() {this.textBox1, this.textBox2, this.textBox3 };
                int idx = textBoxes.IndexOf(sender as TextBox);
                if(idx < textBoxes.Count - 1)
                {
                    textBoxes[idx + 1].Select();
                }
            }


    • 已编辑 朋友的朋友 2019年9月4日 6:36 图片未上传
    • 已标记为答案 czhch 2019年9月6日 22:20
    2019年9月4日 6:35