c#锁定windows窗体控件

c#锁定windows窗体控件,c#,winforms,C#,Winforms,我正在编写winforms应用程序,遇到了一个问题: 例如,我有一个数字上下控件,当按下上/下按钮时,我不希望它改变,但我希望访问新值,而不改变控件本身上的数字 我还需要能够在某些条件下解锁它,所以它看起来是这样的: private void numericUpDown1_ValueChanged(object sender, EventArgs e) { if (!canChange) { int newValue = get_

我正在编写winforms应用程序,遇到了一个问题:

例如,我有一个数字上下控件,当按下上/下按钮时,我不希望它改变,但我希望访问新值,而不改变控件本身上的数字

我还需要能够在某些条件下解锁它,所以它看起来是这样的:

 private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        if (!canChange)
        {
            int newValue = get_expected_new_value();
            doSomeStuff(newValue);
            //some_code_to_cancel_the_value_change;
        }
        else
        {
            //allow the change
            doSomeOtherStuff();
        }
    }

如何做这件事?

您可以使用
numericUpDown1
标记
属性来存储最后一个值。 虽然这不是一个特别优雅的解决方案

归功于:

在您的情况下,它可能看起来像这样:

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            var o = (NumericUpDown) sender;
            int thisValue = (int) o.Value;
            int lastValue = (o.Tag == null) ? 0 : (int)o.Tag;
            o.Tag = thisValue;

            if (checkBox1.Checked) //some custom logic probably
            {
                //remove this event handler so it's not fired when you change the value in the code.
                o.ValueChanged -= numericUpDown1_ValueChanged;
                o.Value = lastValue;
                o.Tag = lastValue;
                //now add it back
                o.ValueChanged += numericUpDown1_ValueChanged;
            }
            //otherwise allow as normal
        }
基本上,您将最后一个已知的正确值存储在
标记中。

然后检查您的条件并将值设置回上一个良好值。

您可以将
最小值
最大值
设置为相同的值。这应该可以防止使用按钮或文本框来更改值。没有更温和的方法吗?混淆最小值和最大值看起来有点可怕,可能会导致错误,加上我需要获得新的预期值,最小值和最大值解决方案将无法帮助我解决这个问题。。。