首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当满足条件时,Winform计时器未运行if语句

当满足条件时,Winform计时器未运行if语句
EN

Stack Overflow用户
提问于 2018-08-01 01:20:47
回答 1查看 29关注 0票数 0

嗨,我遇到了一个奇怪的bug,或者我不理解一些东西。简而言之,我已经拥有了我想要在我的表单上工作的一切,然后我决定将该表单转换为一个选项菜单,这样它就不再是应用程序启动时出现的第一个表单,而是在我单击带有代码的不同表单上的按钮后显示

代码语言:javascript
复制
  private void ShowOptionsButton_Click(object sender, EventArgs e)
    {
        formHomePage.Show();

    }

由于某种原因,计时器if语句不再起作用:

代码语言:javascript
复制
private void StartSubCheckT_Tick(object sender, EventArgs e)
    {

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

            StartSubB.Enabled = true;

        }

下面还有其他if语句,但这些都是不相关的,这样做的目的是在列表大于0时使按钮可用。我已经创建了另一个显示该值的测试按钮,它显示sublminalMessages列表大于0

代码语言:javascript
复制
 private void testbutton3_Click(object sender, EventArgs e)
    {
        MessageBox.Show(subliminalMessages.Count.ToString());
    }

它输出的值应该是1,而其他一些代码在开头加了一个值。但是由于某些原因,即使subliminalmessages.count大于0,if语句也不再被调用,因为我使表单看起来像是从上面的按钮代码中的另一个表单调用的。

在相同的表单上填充和创建subliminalMessages列表

代码语言:javascript
复制
        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");
        }

    }

正在添加的Setting.Default中有一个值

按钮和计时器在同一窗体上,并且有问题的计时器已启用。

有人知道为什么吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 02:15:22

我试着给你一个答复。但这与你现在所做的有点不同。

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

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

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

代码语言:javascript
复制
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);
    }
}

我有一个名为itemsBindingList<string>。这类似于您的subliminalmessages列表,但它是一个BindingList。这种类型的列表有一个ListChanged事件,在向列表添加项或从列表中删除项时会触发该事件。在构造函数中,我们新建了items列表并订阅了ListChanged事件。

Items_ListChanged事件激发时,button3是启用还是禁用取决于items.Count > 0是否启用。

btnAdd_Click中,我们只需向列表中添加一项。在btnRemove_Click中,我们检查有一些项目,然后删除最后一个。

如果您要运行此程序,您将看到,当我们单击Add按钮时,button3将被启用。如果我们单击Remove按钮,我们将看到button3被禁用。

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

如果你实现了这一点,但你的按钮仍然没有激活,那么你可能需要发布更多的代码。剔除所有不相关的内容,并将其放入一个演示条件失败的新项目中,然后将代码复制到此处或提供下载该项目的链接。if语句失败的唯一原因是列表实际上是空的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51618872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档