Windows窗体控件不会被代码隐藏更新

时间:2012-04-19 19:52:20

标签: c# winforms controls code-behind

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

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

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

关于我可能遗失的任何建议?这是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()。基本上,我创建了一个具有相同控件的新表单,只运行了Disable事件,当我复制Load代码时,Disable停止工作。

2 个答案:

答案 0 :(得分:1)

尝试清理解决方案并重新启动所有解决方案。 (:

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

修改

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

开始在整个表单中放置MessageBox.Show(“我执行!”)。将它放在构造函数/初始化事件中。把它放在click事件等中。你可能在某个地方处理异常,而更新表单的代码永远不会有机会执行。

显然出现了问题,直到我们可以排除代码中存在问题,我们才会假设它存在。如果您发布代码,我们可以将其复制并粘贴到我们自己的项目中,看看它的行为方式。如果它有效,那么我们可以确认代码是好的,问题必须存在于其他地方。

希望有所帮助。 (:

修改

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

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;
        }
    }
}

enter image description here

enter image description here

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

修改

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

答案 1 :(得分:1)

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