Winforms Winform计时器不是';t在满足条件时运行if语句

Winforms Winform计时器不是';t在满足条件时运行if语句,winforms,Winforms,嗨,我遇到了一个奇怪的错误或者我不明白什么。 长话短说,我已经有了所有我想在我的表单上工作的东西,工作得很好,然后我决定将表单变成一个选项菜单,这样它就不再是应用程序启动时出现的第一个表单,而是在我用代码单击另一个表单上的按钮后显示的 private void ShowOptionsButton_Click(object sender, EventArgs e) { formHomePage.Show(); } 出于某种原因,计时器if语句不再工作: pr

嗨,我遇到了一个奇怪的错误或者我不明白什么。 长话短说,我已经有了所有我想在我的表单上工作的东西,工作得很好,然后我决定将表单变成一个选项菜单,这样它就不再是应用程序启动时出现的第一个表单,而是在我用代码单击另一个表单上的按钮后显示的

  private void ShowOptionsButton_Click(object sender, EventArgs e)
    {
        formHomePage.Show();

    }
出于某种原因,计时器if语句不再工作:

private void StartSubCheckT_Tick(object sender, EventArgs e)
    {

        if (subliminalMessages.Count > 0)
        {
            MessageBox.Show("list greater than 0 if");

            StartSubB.Enabled = true;

        }
下面还有其他if语句,但它们是无关的,其目的是在列表大于0时使按钮可用。我创建了另一个测试按钮来显示该值,它显示SubMinalMessages列表大于0

 private void testbutton3_Click(object sender, EventArgs e)
    {
        MessageBox.Show(subliminalMessages.Count.ToString());
    }
它在1处输出,它应该来自在开始时添加值的其他代码。但是由于某些原因,即使subliminalmessages.count大于0,if语句也不再被调用,因为我正在使表单看起来是从上面的按钮代码的另一个表单调用的

正在同一表单上填充和创建subliminalMessages列表

        public List<string> subliminalMessages = new List<string>();


   private void Form1_Load(object sender, EventArgs e)
    {

                   if (!String.IsNullOrEmpty(Settings.Default["Subliminal1"].ToString()))
        {
            subliminalMessages.Add(Settings.Default["Subliminal1"].ToString());
            MessageBox.Show("If worked");
        }

    }
public List subliminalMessages=new List();
私有void Form1\u加载(对象发送方、事件参数e)
{
如果(!String.IsNullOrEmpty(Settings.Default[“Subliminal1”].ToString())
{
subliminalMessages.Add(Settings.Default[“Subliminal1”].ToString());
MessageBox.Show(“如果工作”);
}
}
设置中有一个值。正在添加的默认值

按钮和计时器位于同一窗体上,并且相关计时器已启用

有人知道为什么吗


谢谢

我试着给你一个答案。但这和你现在所做的有些不同

根据我对您代码的理解,您正在使用计时器启用/禁用StartSubB按钮。或者干脆启用它

与其依赖似乎不起作用的计时器,为什么不使用
绑定列表
。这有一个名为
ListChanged
的事件,您可以处理该事件,然后启用/禁用按钮

这是我创建的一个测试表单:

public partial class Form1 : Form
{
    BindingList<string> items;
    public Form1()
    {
        InitializeComponent();

        button3.Enabled = false;

        items = new BindingList<string>();
        items.ListChanged += Items_ListChanged;
    }

    private void Items_ListChanged(object sender, ListChangedEventArgs e)
    {
        button3.Enabled = items.Count > 0;
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        items.Add("a");
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {
        if (items.Count > 0)
            items.RemoveAt(items.Count - 1);
    }
}
公共部分类表单1:表单
{
清单项目;
公共表格1()
{
初始化组件();
按钮3.Enabled=false;
items=newbindingList();
items.ListChanged+=items\u ListChanged;
}
私有无效项\u ListChanged(对象发送方,ListChangedEventArgs e)
{
button3.Enabled=项目数>0;
}
私有void btnAdd_单击(对象发送者,事件参数e)
{
项目。添加(“a”);
}
私有void btnRemove_单击(对象发送者,事件参数e)
{
如果(items.Count>0)
items.RemoveAt(items.Count-1);
}
}
我有一个名为
项的
绑定列表
。这与您的
潜意识消息列表非常相似,但它是一个
绑定列表
。此类型的列表有一个
ListChanged
事件,在列表中添加或删除项目时触发该事件。在构造函数中,我们新建
列表,并订阅
列表更改
事件

Items\u ListChanged
事件触发时,根据
Items.Count>0
是否启用或禁用
按钮3

btnAdd\u中单击
我们只需将一项添加到列表中。 在
btnRemove\中,单击
检查是否存在某些项目,然后删除最后一个项目

如果要运行此命令,您会看到,当我们单击“添加”按钮时,
button3
被启用。如果单击“删除”按钮,我们将看到
按钮3
被禁用

BindingList
的唯一限制是不能通过传入另一个列表来添加范围


如果您实现了这个功能,但按钮仍然没有激活,那么您可能需要发布更多的代码。去掉所有不相关的东西,把它放在一个新的项目中,这个项目演示了条件的失败,或者在这里复制代码,或者提供一个下载项目的链接。if语句失败的唯一原因是如果列表实际上是空的。

要继续下去就很难帮助了。下意识信息在哪里被填充?是同一张表吗?或者在另一个表单上(您变成菜单的表单)。如果您发布更多代码或显示if语句不起作用的精简版本,则会更容易提供帮助。下意识信息列表与计时器的形式相同吗?testbutton与计时器的形式相同吗?是否有可能在填充列表之前计时器已启动?计时器启用了吗?@谢谢你的回复,刚刚添加了你询问的信息。如果我没有弄错,你有一个带有潜意识信息的表单和一个计时器。加载表单时,使用“设置”中的项目填充子列表。在这之后的某个时刻,您希望StartSubCheckT勾选激活,并看到submes>0并启用该按钮。滴答声的间隔是多少?有没有可能它还没有发射?我会在记号的第一行放上一条写线,要么打印“记号”,要么写下子菜单的计数。这样,您就可以知道计时器何时启动,并且将时间间隔设置为500。已经尝试过使用messagebox,计时器正在启动,但是if语句不起作用,这就是为什么我如此困惑的原因500不到一秒钟,所以应该经常启动。看看我的答案。它不再使用计时器,但如果我理解正确,它应该做你想做的。谢谢,如果它允许我,我会给它投票。我甚至不知道绑定的概念。我没有提到它,因为我甚至没有意识到要测试它,但是在另一个if语句中有同样的问题,但是使用绑定列表已经修复了它。我仍然很好奇,为什么if声明在满足条件时不起作用,但至少在满足条件时起作用