Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ToolStripButton之前处理NumericUpDown.ValueChanged事件。单击事件_C#_Winforms_User Interface_Toolstripbutton - Fatal编程技术网

C# 在ToolStripButton之前处理NumericUpDown.ValueChanged事件。单击事件

C# 在ToolStripButton之前处理NumericUpDown.ValueChanged事件。单击事件,c#,winforms,user-interface,toolstripbutton,C#,Winforms,User Interface,Toolstripbutton,我有一个带有NumericUpDown和ToolStripButton的表单 在NumericUpDownsValueChanged事件处理程序中,某些对象实例的值已更改 在ToolStripButtons单击事件处理程序中,保存对象实例 现在的问题是,如果我重写NumericUpDown中的值,然后单击ToolStripButton保存状态,ToolStripButtonsclick事件在NumericUpDownsValueChanged事件之前触发我改变了它 public partial

我有一个带有
NumericUpDown
ToolStripButton
的表单

NumericUpDown
s
ValueChanged
事件处理程序中,某些对象实例的值已更改

ToolStripButton
s
单击事件处理程序中,保存对象实例

现在的问题是,如果我重写
NumericUpDown
中的值,然后单击
ToolStripButton
保存状态,
ToolStripButton
s
click
事件在
NumericUpDown
s
ValueChanged
事件之前触发
我改变了它

public partial class Form2 : Form
{
    private Foo _foo = new Foo();

    public Form2()
    {
        InitializeComponent();
    }

    private void NumericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        _foo.Value = numericUpDown1.Value;
    }

    private void ToolStripButton1_Click(object sender, EventArgs e)
    {
        _foo.Save();
    }

    private class Foo
    {
        public decimal Value { get; set; }

        public void Save()
        {
            //Save the value...
        }
    }
}
解决这个问题的最佳方法是什么?

如果我使用
按钮
控件,这些事件将按正确的顺序触发,但如果我使用
ToolStripButton
控件,则不会触发这些事件。

作为选项,而不是
值更改
,处理
数值上下
已验证
事件,并在
ToolStripButton
事件处理程序中单击
,保存前调用this.Validate()

private void NumericUpDown1_Validated(object sender, EventArgs e)
{
    _foo.Value = numericUpDown1.Value;
}

private void ToolStripButton1_Click(object sender, EventArgs e)
{
    this.Validate();
    _foo.Save();
}

注意:如果表单上的其他控件可能有
验证
事件,并且您可以为它们设置
e.Cancel=true
,则在调用
保存
之前,需要使用
If(this.Validate()){/*…*}
重载
Foo.Save()
,检查
方法的结果,因此它接受一个十进制参数:
Foo.Save(十进制值)。原始的、无参数的
Foo.Save()
只需调用
Save(this.Value)
。在
ToolStripButton1\u单击
然后可以调用
Foo.Save(numericUpDown1.Value)
,这样它将保存当前手动编辑的值。这真的很有趣。因此,如果我使用
numericUpDown1.Value
它将刷新其值,并立即触发
ValueChanged
事件,因此在获取
numericUpDown1.Value
之后,我还可以从
\u foo.Value
中获取正确的值。获取当前值时,事件序列将恢复为标准行为,因此在获取编辑的值后立即引发
ValueChanged
。此解决方案有效。我已经尝试调用
验证
,但仅针对
数值上下
调用,结果无效。知道为什么它适用于整个
表单
,但不适用于指定的控件吗?@Artholl我的期望是,通过调用
NumericUpdown
Validate
方法并处理
Validated
事件,可以得到相同的结果;但我还没试过。