【问题标题】:Windows Form Controls Aren't Updated by Code BehindWindows 窗体控件不会被隐藏的代码更新
【发布时间】:2012-04-19 19:52:19
【问题描述】:

我的 Windows 表单项目中的某个表单存在问题。只有一种形式有问题;还有其他几个使用相同类型的引用没有这个问题。

问题是通过后面的代码修改控件实际上并没有在表单上更新它们。从添加从数据库中提取的值到组合框的 Items 集合(通过.Items.Add() 方法),设置文本框或复选框是否启用,设置文本框的文本或选中状态一个复选框......没有任何作用。我已经尝试注释掉所有方法中的所有代码,除了为某些控件实际设置启用状态的代码,以确保在我不知道的情况下没有其他任何东西在运行,但问题仍然存在。

正如调试器所示,更改启用状态的代码肯定会被命中,并且启用状态设置正确,根据条件是真还是假。应该禁用的控件仍然是可编辑的,并且看起来仍然是可编辑的。该代码最初是使用智能感知编写的以自动填写控件名称,因此从后面的代码链接到表单上的正确控件应该没有任何问题。我还尝试将表单放大并放入空白面板,上面有一个新的文本框和复选框,并通过相同的方法将面板设置为启用或禁用,当它运行时,控件也没有被后面的代码改变了。

对我可能遗漏的内容有什么建议吗?这是 Windows 窗体的基本功能,我不知道可能是什么问题,而且通过谷歌搜索或搜索此站点也找不到任何类似的问题。

谢谢!

编辑:这是一个应该可以工作但没有工作的代码示例。类似的代码在其他一些表单上使用没有问题。

当一个名为 chkDisable 的复选框被选中时,此事件运行:

    private void chkDisable_CheckedChanged(object sender, EventArgs e)
    {
        SetControlsEnabledStatus(!((CheckBox)sender).Checked);
    }

    private void SetControlsEnabledStatus(bool enabledStatus)
    {
        textBox1.Enabled = enabledStatus;
        textBox2.Enabled = enabledStatus;
    }

我 100% 确定此事件连接正确、触发正确,并且文本框的启用状态设置正确。没有其他方法具有可以覆盖它的未注释代码。但是,只要单击复选框后再次加载表单,文本框就会始终处于启用状态。

EDIT2:如果有人因为自己的问题遇到这个问题,这就是导致我的问题的原因:

我必须从头开始创建一个新表单,才能最终找到它。事实证明,在构造函数和 FormLoad 事件中都调用了 InitializeComponent()。基本上,我创建了一个带有相同控件的新表单,只运行了禁用事件,当我复制加载代码时,禁用停止工作。

【问题讨论】:

  • ...也可能是 *.Designer.cs 文件。
  • @Likurg,我添加了一个代码示例。
  • @Alan,你能扩展 Designer 文件吗?我不确定在那里寻找什么。谢谢。
  • 设计师文件:imgur.com/R96LN

标签: c# winforms controls code-behind


【解决方案1】:

尝试清理您的解决方案并重新构建一切以开始。 (:

如果这不起作用,您可以发布一些代码吗?

编辑:

好的,这里没有可查看的代码,...我将提供一些基本建议。

开始在整个表单中添加 MessageBox.Show("I executed!")。把它放在构造函数/初始化事件中。将它放在点击事件等中。您可能正在某处处理异常,并且更新表单的代码永远没有机会执行。

显然存在问题,在我们排除您的代码中存在问题之前,我们将假定问题存在。如果您发布代码,我们可以将其复制并粘贴到我们自己的项目中,然后查看它的行为。如果可以,那么我们可以确认代码是好的,问题一定存在于其他地方。

希望能有所帮助。 (:

编辑:

好的,使用你提供的代码,我创建了一个沙盒项目:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinFormsSandbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void chkDisable_CheckedChanged(object sender, EventArgs e)
        {
            SetControlsEnabledStatus(!((CheckBox)sender).Checked);
        }

        private void SetControlsEnabledStatus(bool enabledStatus)
        {
            textBox1.Enabled = enabledStatus;
            textBox2.Enabled = enabledStatus;
        }
    }
}

它对我有用。您发布的代码中不得存在错误。

编辑:

您知道,我讨厌放弃寻找问题的根本原因,但如果这是一个对时间敏感的问题,您可能会更快地从头开始创建新表单并复制功能。 (:

【讨论】:

  • 谢谢,但清理解决方案没有帮助。我不确定代码示例会有多大帮助,因为它非常标准——复选框的 CheckChanged 方法,然后根据是否选中来禁用或启用其他控件。
  • @Greg,所以您希望我们无需任何代码就能找到您的问题。如果一切都是pretty standard,你就不会问这个问题了。无论如何,如果我能找到我的水晶球,我会尝试找到解决方案。
  • @L.B,不必刻薄。我知道有些人在这方面的经验和知识比我多得多,所以我不认为在没有代码示例的情况下提问会是一件坏事。也就是说,我编辑了我的帖子以包含一个示例。如果您有任何建议,请告诉我。
  • 感谢您的协助。我不认为问题出在代码本身,但很高兴确认它确实在不同的系统中正常工作。
  • 好吧,我不得不从头开始创建一个新表单,才能最终找到它。事实证明,在构造函数和 FormLoad 事件中都调用了InitializeComponent()。基本上,我创建了一个带有相同控件的新表单,只运行了禁用事件,当我复制加载代码时,禁用停止工作。感谢您抽出宝贵时间提供帮助!
【解决方案2】:

我也遇到过类似的问题,他们通过在我的表单中添加一个 OnShown 处理程序得到了帮助,该处理程序会翻转一个保护其他事件处理代码的布尔值。这个想法是初始化过程中的某些事情导致控件的事件以您不希望发生的方式触发。这并不理想,但至少作为调试措施可能值得尝试。

【讨论】:

  • 谢谢,这是我没有想到的主意。我添加了它,并确实发现它由于某种原因两次通过 OnShown 的方法事件处理程序运行。问题仍然存在,但这绝对是朝着正确方向迈出的一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多