繁体   English   中英

在文本框中进行制表-在小数点前后的值之间制表

[英]Tabbing within a textbox - Tab between value before and after decimal point

我是Winform C#的新手。 现在,我面临着极具挑战性的要求,但这对你们来说可能很愚蠢。

你们中的任何一个都可以帮助我提供下面满足我要求的代码。

我在Winform应用程序中有一个十进制值(金额)的文本框。 我一直保持良好的验证等。小数点后仅允许两位数字。 同样,如果用户从上一个控件切换到此文本框,则whoe值(文本框中的小数表示“ 22223.39”将被突出显示)。 都好。

但是,我的业务用户想要的是,如果他从先前的控件切换到此文本框,并假设他们想在上述示例中仅更改小数点后的数字,即“ 39”,则他们希望切换并仅键入,以便仅被新值覆盖,值“ 22223”将保持不变。 他们应该能够前后退缩。

即,简单地说,如果用户在文本框中单击标签,则应首先转到数字字段并突出显示数字(在上面的示例中,应突出显示“ 22223”,然后,如果用户再次按tab,则应转到并突出显示小数点后的数字(在上面的示例39“中)。我不确定如何执行此操作。并且,如果用户再次第三次按下该选项卡,则应移至下一个控件/文本框(常规)。

但是我想到保留2个文本框,这很愚蠢。 我只想在文本框及其C#Winform应用程序中获得与我提到的功能完全相同的功能。

我也不需要数字上落控件,它有一些限制。

正如杰里米·汤普森(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);
    }
} 

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

另外,您必须关闭控件上的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM