如何在失去焦点后保持NumericUpDown的无效值?

时间:2010-02-23 04:08:48

标签: c# .net winforms .net-2.0

在我的项目中有一个UserControl,其中包含一个NumericUpDown ctrl,其有效值范围是从10到100

因此,如果用户在NumericUpDown ctrl中输入200,那么在焦点更改为其他ctrl后其值将自动更改为100,它对客户看起来有点好奇,因为他们可能会在NumericUpDown中输入200之后单击OK按钮ctrl,他们需要一个消息框,告诉他们输入的值不在范围内。

但问题是,如果值输入超出其范围,NumericUpDown的值将在焦点更改后自动更改。

那么如何实现呢?

Sameh Serag,这是我测试过的代码。我在表单上添加了一个按钮,但什么也没做。我的结果是在输入200并单击按钮后,只显示值为100的消息框。输入200并按Tab键后,它只会显示一个值为200的消息框,而NumericUpDown中的文本值将更改为100.很好奇:-)无论如何,非常感谢你的帮助!顺便说一句,.Net框架版本是2.0,sp2对我来说。

public partial class Form1 : Form
{
    private TextBox txt;

    public Form1()
    {
        InitializeComponent();

        txt = (TextBox)numericUpDown1.Controls[1];
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_Validating(object sender, CancelEventArgs e)
    {
        MessageBox.Show(txt.Text);
    }
}

1 个答案:

答案 0 :(得分:13)

技巧是将文本框嵌入到数字更新控件中,并处理其Validating事件。

以下是如何完成它:

创建一个虚拟表单并添加一个数字更新控件和一些其他控件,当数字下拉控件失去焦点时,表单文本将设置为用户输入的值。

这是我所做的代码:

public partial class Form1 : Form
    {
        TextBox txt;
        public Form1()
        {
            InitializeComponent();
            txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control
            txt.Validating += new CancelEventHandler(txt_Validating);
        }
        void txt_Validating(object sender, CancelEventArgs e)
        {
            this.Text = txt.Text;
        }
    }

修改

@Carlos_Liu:好的,我现在可以看到问题,你可以用TextChanged事件来实现这个,只需将值保存在虚拟变量中并在txt_Validating中重用它,但要小心,不要更新这个变量,除非文本框是专注的

以下是新的示例代码:

public partial class Form1 : Form
{
    TextBox txt;
    string val;
    public Form1()
    {
        InitializeComponent();
        txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control
        txt.TextChanged += new EventHandler(txt_TextChanged);
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_TextChanged(object sender, EventArgs e)
    {
        if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick
            val = txt.Text;
    }
    void txt_Validating(object sender, CancelEventArgs e)
    {
        MessageBox.Show("Val: " + val);
    }
}

修改#2

@Carlos_Liu:如果你需要保留输入的值,仍然有一个技巧:@文本框的验证事件,检查值,如果它不在范围内,取消失去焦点!

以下是代码的新版本:

public partial class Form1 : Form
{
    TextBox txt;
    string val;
    public Form1()
    {
        InitializeComponent();
        txt = (TextBox)numericUpDown1.Controls[1];
        txt.TextChanged += new EventHandler(txt_TextChanged);
        txt.Validating += new CancelEventHandler(txt_Validating);
    }

    void txt_TextChanged(object sender, EventArgs e)
    {
        if (txt.Focused)
            val = txt.Text;
    }
    void txt_Validating(object sender, CancelEventArgs e)
    {
        int enteredVal = 0;
        int.TryParse(val, out enteredVal);
        if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum)
        {
            txt.Text = val;
            e.Cancel = true;
        }
    }
}