winforms Numericupdowns有不同的行为

bakd9h0s  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(48)

在我的C#项目中有三个不同的numericupdowns,它们都有相同的属性和值:
x1c 0d1x的数据




所有这三个都有相同的方法连接起来,即numericUpDown1_ValueChanged:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            applyAnimationTimeout();
        }

字符串
所有这三个值都在启动时通过CheckAnimationException方法更改。

private void checkAnimationTimeout()
        {
            numericUpDown1.Value = Properties.Settings.Default.animationResizeTop; // resize timing
            numericUpDown2.Value = Properties.Settings.Default.animationDockBottom; // resize timing
            numericUpDown3.Value = Properties.Settings.Default.animationSettingResize;//animationSettingResize; // resize setting timing
        }


所有这三个都有自己的值,因此它们的相关设置都可以通过applyAnimationList()方法进行修改。

private void applyAnimationTimeout()
        {
            Properties.Settings.Default.animationResizeTop = (int)numericUpDown1.Value; // assign value to the correct NumericUpDown
           Properties.Settings.Default.animationDockBottom = (int)numericUpDown2.Value; // assign value to the correct NumericUpDown
            Properties.Settings.Default.animationSettingResize = (int)numericUpDown3.Value; // assign value to the correct NumericUpDown
            Properties.Settings.Default.Save();

        }


这三个属性都指定了完全相同的类型和完全相同的作用域。

然而,唯一一个值被正确更改的是numericUpDown 1。只有在这些方法中修改这些属性,并且只有在表单启动时,在check()中调用checkAnimationList方法。x1c4d 1x
如果我在运行时强制运行checkAnimationList和applyAnimationList,它会一直工作,直到我关闭窗体。但是当我重新打开它时,它只将这两个数值的值上下重置为最小值,就好像我插入的值不正确一样。没有任何其他方法可以修改这些属性。
我试过重新添加这些唐斯,根据even形式的标签强制设置它们的值,多次重写代码,复制numericUpDown 1,但什么都没有-总是同样的问题,总是使用相同的两个属性,总是使用相同的两个控件。因为如果我设置这些来加载第一个属性,我不知道是什么引起的,也不知道我能做些什么来修复它。

brqmpdu1

brqmpdu11#

当您在启动时从设置中设置numericUpDown1值时-它会触发您的numericUpDown1_ValueChanged处理程序。触发器numericUpDown2numericUpDown3从设置中接收其值之前。
当它发生在启动时,numericUpDown2numericUpDown3被设置为默认值(最小值)。因此,ValueChanged处理程序捕获其默认值并覆盖设置(标记这一时刻,请参阅下面的解决方案)。
调用链看起来像:
Settings read -> numericUpDown1 -> ValueChanged handler -> Settings write -> Settings save -> Settings read -> numericUpDown2 -> ...
不包括:
Settings read -> numericUpDown1 -> Settings read -> numericUpDown2 -> Settings read -> numericUpDown3
正如你所料
总的麻烦是,每次numericUpDown更改时,您都要强制重写设置并保存。
我建议将您的代码从applyAnimationTimeout()或其调用从ValueChanged处理程序移动到FormClosing处理程序。这样,设置不会在每次numericUpDown值更改时都被覆盖,而是仅在关闭表单时被覆盖一次。
当然,设置将正确恢复。
程式码范例:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        // ...

        this.FormClosing += delegate
        {
            // Capture values and save only once before form closed
            applyAnimationTimeout();
        };
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        // Comment or remove its call away from here
        // applyAnimationTimeout();
    }
}

字符串

相关问题