1

我需要确定 NumericUpDown 控件的值是否被mouseUp 事件更改。

当 numericupdown 的值发生变化时,我需要调用一个昂贵的函数。我不能只使用“ValueChanged”,我需要使用 MouseUp 和 KeyUp 事件。

在此处输入图像描述

基本上,我需要知道:

当用户放开鼠标时 numericUpDown 的值是否发生了变化? 如果单击任何未以红色突出显示的区域,则答案是否定的。我需要在任何地方但单击红色区域时忽略鼠标向上事件。

如何通过代码确定这一点?我觉得事件有点混乱。

4

3 回答 3

2

这将在用户释放鼠标按钮时触发。您可能想调查释放了哪个鼠标按钮。

编辑

    decimal numvalue = 0;
    private void numericUpDown1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && numvalue != numericUpDown1.Value)
        {
            //expensive routines
            MessageBox.Show(numericUpDown1.Value.ToString());
        }

        numvalue = numericUpDown1.Value;
    }

编辑 2 这将确定鼠标左键是否仍然按下,如果它在执行昂贵的例程之前退出,对键盘按钮按下没有帮助。

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left)
        {
            return;
        }
        //expensive routines


    }

编辑 3

如何检测当前按下的键?

将有助于解决 Any 键,尽管我认为唯一重要的是箭头键

于 2012-06-11T13:24:34.813 回答
2

问题 - 我需要在任何地方但单击红色区域时忽略鼠标向上事件。

派生一个自定义数值控件,如下所示。获取 Numeric Control 的 TextArea 并忽略 KeyUp。

class UpDownLabel : NumericUpDown
{
    private Label mLabel;
    private TextBox mBox;

    public UpDownLabel()
    {
        mBox = this.Controls[1] as TextBox;
        mBox.Enabled = false;
        mLabel = new Label();
        mLabel.Location = mBox.Location;
        mLabel.Size = mBox.Size;
        this.Controls.Add(mLabel);
        mLabel.BringToFront();
        mLabel.MouseUp += new MouseEventHandler(mLabel_MouseUp);
    }


    // ignore the KeyUp event in the textarea
    void mLabel_MouseUp(object sender, MouseEventArgs e)
    {
        return;
    }

    protected override void UpdateEditText()
    {
        base.UpdateEditText();
        if (mLabel != null) mLabel.Text = mBox.Text;
    }
}

在 MainForm 中,使用此控件更新您的设计器,即UpDownLabel:-

private void numericUpDown1_MouseUp(object sender, MouseEventArgs e)
{
    MessageBox.Show("From Up/Down");
}

引用自 - https://stackoverflow.com/a/4059473/763026并处理了 MouseUp 事件。

现在,使用此控件而不是标准控件并挂钩 KeyUp 事件。当您单击微调器 [Up/Down 按钮,这又是从 UpDownBase 派生的不同控件] 时,您将始终仅从 Up/Down 按钮获得 KeyUp 事件,即红色区域。

于 2012-06-11T13:58:39.417 回答
1

我认为你应该使用Leave事件,当NumericUpDown控制焦点消失时,它会调用。

    int x = 0;
    private void numericUpDown1_Leave(object sender, EventArgs e)
    {
        x++;
        label1.Text = x.ToString();
    }
于 2012-06-11T13:29:23.120 回答