在SelectedIndexChanged中更改TabStop运行得太晚了

时间:2014-04-01 18:54:59

标签: c# asp.net .net winforms

我有一个带有多个ComboBox控件的通话记录表单。

为了加速数据输入,根据以前的字段为某些字段选择默认值。其中一些默认值很可能是真的,所以我希望在Tab键顺序中完全跳过默认字段。

例如,用户名字段设置成员资格类型字段的值。如果用户是成员,那么成员ComboBox将始终是成员,因此它不应该是TabStop,但如果用户名是“非成员”,则有一些选择,因此它应该是TabStop。

在用户名的SelectedIndexChanged事件中,我有逻辑来设置成员资格类型的TabStop,但因为成员资格类型是用户名设置后的下一个字段,所以为时已晚。选项卡处理已经开始,无论该字段上的TabStop是什么,焦点字段都将设置为成员资格类型。

我无法使用焦点事件,因为当用户点击该字段时它们也会触发,然后它仍应激活。只有标签才能生效。

1 个答案:

答案 0 :(得分:0)

经过一些小提琴后,我提出了以下解决方案,但我之前找不到任何内容,所以我发布它以防万一。我在表单层覆盖ProccessTabKey以检查WinForms是否搞砸了。

protected override bool ProcessTabKey(bool forward)
{
    //find out where we are
    Control startingFocus = this.ActiveControl;

    //go to the next control
    SelectNextControl(startingFocus, forward, true, true, true);

    //find out if we still wanted to go there, (tabstop might have been changed in a SelectedIndexChanged)
    Control newNext = GetNextControl(startingFocus, forward);
    while (!newNext.TabStop)
    {
        newNext = GetNextControl(newNext, forward);
    }

    //if we are in the wrong place, move to the right place
    if (this.ActiveControl != newNext)
    {
        newNext.Focus();
    }

    return true;
}