【问题标题】:Handle NumericUpDown.ValueChanged event before ToolStripButton.Click event在 ToolStripButton.Click 事件之前处理 NumericUpDown.ValueChanged 事件
【发布时间】:2019-05-29 09:17:38
【问题描述】:

我有一个带有NumericUpDownToolStripButton 的表单。

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

ToolStripButtons Click 事件处理程序中,对象实例被保存。

现在的问题是,如果我重写NumericUpDown 中的值,然后单击ToolStripButton 以保存状态,则ToolStripButtons Click 事件被触发之前 NumericUpDowns 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...
        }
    }
}

解决这个问题的最佳方法是什么?
如果我使用 Button 控件,这些事件会以正确的顺序触发,但如果我使用 ToolStripButton 控件,则不会。

【问题讨论】:

  • 重载Foo.Save(),所以它接受一个十进制参数:Foo.Save(decimal value);。原始的无参数Foo.Save() 可以直接调用Save(this.Value)。在ToolStripButton1_Click 中,您可以调用Foo.Save(numericUpDown1.Value),这样它将保存当前手动编辑的值。
  • 这真的很有趣。因此,如果我使用numericUpDown1.Value,它将刷新它的值并立即触发ValueChanged 事件,因此在获得numericUpDown1.Value 之后,我还可以从_foo.Value 获得正确的值。
  • 是的。获取当前值后,事件序列将恢复为标准行为,因此在您获得编辑值后立即引发 ValueChanged

标签: c# winforms user-interface toolstripbutton


【解决方案1】:

作为一个选项,代替ValueChanged,处理NumericUpDownValidated 事件以及ToolStripButtonClick 事件处理程序,在保存之前调用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();
}

注意:如果表单上有其他控件可能有Validating事件,你可以为它们设置e.Cancel = true,你需要在调用之前检查Validate方法的结果Save,使用if(this.Validate()){ /*...*/ }

【讨论】:

  • 此解决方案有效。我已经尝试拨打Validate,但只拨打NumericUpDown,但没有成功。知道为什么它适用于整个 Form,但不适用于指定的控件吗?
  • @Artholl 我的期望是通过调用NumericUpdownValidate 方法并处理Validated 事件,你会得到相同的结果;但我没试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多