Обрабатывать событие NumericUpDown.ValueChanged перед событием ToolStripButton.Click - PullRequest
1 голос
/ 29 мая 2019

У меня есть форма с NumericUpDown и ToolStripButton.

В обработчике событий NumericUpDown s ValueChanged значение некоторого экземпляра объекта изменяется.

В обработчике событий ToolStripButton s Click экземпляр объекта сохраняется.

Теперь проблема в том, что если я переписываю значение в 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...
        }
    }
}

Как лучше всего это решить?
Эти события запускаются в правильном порядке, если я использую элемент управления Button, но не если я использую элемент управления ToolStripButton.

1 Ответ

1 голос
/ 30 мая 2019

Как вариант, вместо ValueChanged обрабатывать Validated событие NumericUpDown, а также в обработчике Click 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();
}

Примечание: Если в форме есть другие элементы управления, которые могут иметь событие Validating, и вы можете установить для них e.Cancel = true, вам необходимо проверить результат метода Validate перед вызовом Save, используя if(this.Validate()){ /*...*/ }.

...