在文本框中使用Tab键 - 在小数点之前和之后的值之间切换

时间:2012-03-25 23:03:11

标签: c# .net winforms textbox

我是Winform C#的新手。现在我处在一个具有挑战性的要求中,但对你们来说这可能是愚蠢的。

你们中的任何人都可以帮我解决下面的要求代码。

我在Winform应用程序中有一个十进制值(Amount)的文本框。我保持了良好的验证等。小数点后只允许2位数。此外,如果用户从先前的控件选项到此文本框,则将突出显示whoe值(文本框中的十进制数字例如“22223.39”)。一切都好。

但我的商业用户想要,如果他从之前的控件选中此文本框,并假设他们想在上面的例子中单独更改小数点后的数字,即“39”他们想要选项卡,只需键入以便它只会被一个新值覆盖,值“22223”将保持不变。他们应该能够前后后退。

即类似,简单来说,如果用户在文本框中选项卡,它应首先转到数字字段并突出显示数字(在上面的示例中,它应突出显示“22223”,然后如果用户再次按Tab键,它应该去突出显示小数点后的数字(在上面的例子39“中)。我不确定如何做。而且,如果用户再次按下标签第3次,它应该移动到下一个控件/文本框(Asusual)

但我知道保留2个文本框,这很愚蠢。我想要完全相同的功能,我提到的只有在文本框和它的C#Winform应用程序。

此外,我不需要数字更新控件,这已经满足了我们的要求。

2 个答案:

答案 0 :(得分:4)

正如Jeremy Thompson正确地说的那样,这是一个坏主意,所以你应该试着说服用户使用其他更标准的输入法。

那就是说,主要是作为一个看看我是否可以完成这项工作的练习,我提出了以下子类文本框控件,它在我能想到的每一个试验中都能正常运行。这包括正确标签进出文本框以及向左箭头再次突出显示小数部分等内容。

主要技巧是IsInputKey覆盖 - 其余的代码来自我测试的东西。如果你最终使用基于此的东西,请彻底测试它,因为任何标准控制功能的变形都可能有奇怪的角落案例陷阱。

public class TabTextBox : TextBox
{

    public bool ready_to_leave = false;

    protected override void OnEnter(EventArgs e)
    {
        this.SelectionStart = 0; // this.Text.IndexOf(".") + 1;
        this.SelectionLength = this.Text.IndexOf(".");
    }  

    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Tab && !ready_to_leave)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        ready_to_leave = false;
        base.OnLeave(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (ready_to_leave)
        {
            e.Handled = true;
        }
        base.OnKeyPress(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyData == Keys.Tab && !ready_to_leave)
        {
            this.SelectionStart = this.Text.IndexOf(".") + 1;
            this.SelectionLength = 2;
            ready_to_leave = true;
            e.Handled = true;
        }
        else
        {

            base.OnKeyDown(e);
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
            if (this.SelectionStart - 1 < this.Text.IndexOf("."))
                ready_to_leave = false;
        }
        base.OnKeyUp(e);
    }
} 

答案 1 :(得分:1)

这不是一个好主意,它违背了窗口应用程序的标准操作。

另外,您必须关闭控件上的TabStop并自行完成Tabbing。我会用上面的内容与用户交谈并询问是否按下“。”足以突出小数位。这里有一些代码来演示我提出的解决方案:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 190 && textBox1.Text.IndexOf(".") > 0)
    {
        textBox1.SelectionStart = textBox1.Text.IndexOf(".") + 1;
        textBox1.SelectionLength = 2;
        e.SuppressKeyPress = true;
    }
}

如果您希望多个文本框共享此功能,请进入InitializeComponent()并执行以下操作:

this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);