winforms Numericupdowns有不同的行为

bakd9h0s  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(188)

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




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

  1. private void numericUpDown1_ValueChanged(object sender, EventArgs e)
  2. {
  3. applyAnimationTimeout();
  4. }

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

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


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

  1. private void applyAnimationTimeout()
  2. {
  3. Properties.Settings.Default.animationResizeTop = (int)numericUpDown1.Value; // assign value to the correct NumericUpDown
  4. Properties.Settings.Default.animationDockBottom = (int)numericUpDown2.Value; // assign value to the correct NumericUpDown
  5. Properties.Settings.Default.animationSettingResize = (int)numericUpDown3.Value; // assign value to the correct NumericUpDown
  6. Properties.Settings.Default.Save();
  7. }


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

然而,唯一一个值被正确更改的是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值更改时都被覆盖,而是仅在关闭表单时被覆盖一次。
当然,设置将正确恢复。
程式码范例:

  1. public partial class MainForm : Form
  2. {
  3. public MainForm()
  4. {
  5. InitializeComponent();
  6. // ...
  7. this.FormClosing += delegate
  8. {
  9. // Capture values and save only once before form closed
  10. applyAnimationTimeout();
  11. };
  12. }
  13. private void numericUpDown1_ValueChanged(object sender, EventArgs e)
  14. {
  15. // Comment or remove its call away from here
  16. // applyAnimationTimeout();
  17. }
  18. }

字符串

展开查看全部

相关问题