首页 > 解决方案 > 无法更改事件的表单标签

问题描述

我有两个静态标签,它们应该显示我保留在后端的用户计数器,但它们不会在表单上更改。我已经尝试寻找答案,但我无法理解其中的大部分。

        //Watchers
        private static void CDdirWatcher_Created(object sender, FileSystemEventArgs e)
        { 
            CDCreated += 1; 
        }
        private static void LPdirWatcher_Created(object sender, FileSystemEventArgs e)
        { 
            LPCreated += 1; 
        }

所以以上是我的计数器上升的事件

以下是我尝试进行的用于更改标签的事件。

    private void cdCounterLbl_TextChanged(object sender, EventArgs e)
    { 
        cdCounterLBL.Text = CDCreated.ToString();
    }
    private void lpCounterLbl_TextChanged(object sender, EventArgs e)
    {
        lpCounterLBL.Text = Convert.ToString(LPCreated);
    }

我正在努力

        cdCounterLBL.TextChanged += cdCounterLbl_TextChanged;
        lpCounterLBL.TextChanged += lpCounterLbl_TextChanged;

我已经尝试了上述方法,但标签仍然没有改变

标签: c#winformsevents

解决方案


感谢您花时间分享您的问题。

您似乎误解了什么是类、变量、方法和事件,以及如何使用它们。

也就是说,如果我了解您想要做什么,这可能会解决您的问题。

当您通过代码更改 Text 属性时,会引发用于标签的 TextChanged。

并不是因为您更改了计数器的值,才会为标签引发某些事件。

计数器和标签是两个独立的东西,完全不同且不相关,没有链接,但您可以链接如下:

private static void CDdirWatcher_Created(object sender, FileSystemEventArgs e)
{ 
  CDCreated += 1; 
  cdCounterLbl_TextChanged(this, null);
}

private static void LPdirWatcher_Created(object sender, FileSystemEventArgs e)
{ 
  LPCreated += 1;
  lpCounterLbl_TextChanged(this, null);
}

private void cdCounterLbl_TextChanged(object sender, EventArgs e)
{ 
  cdCounterLBL.Text = CDCreated.ToString();
}

private void lpCounterLbl_TextChanged(object sender, EventArgs e)
{
  lpCounterLBL.Text = LPCreated.ToString();
}

所以这不起作用,因为静态方法,我们有一个糟糕的设计,因为调用 TextChanged 来更改文本。

因此这里该怎么办。

添加静态事件:

private static Action CountersUpdated;

添加表单的 Load 事件:

CountersUpdated += DoUpdateCounters;

在表单的 FormClosed 事件中:

CountersUpdated -= DoUpdateCounters;

和:

private void DoUpdateCounters()
{ 
  cdCounterLBL.Text = CDCreated.ToString();
  lpCounterLBL.Text = LPCreated.ToString();
}

现在你可以写:

private static void CDdirWatcher_Created(object sender, FileSystemEventArgs e)
{ 
  CDCreated++; 
  CallCountersUpdated();
}

private static void LPdirWatcher_Created(object sender, FileSystemEventArgs e)
{ 
  LPCreated++;
  CallCountersUpdated();
}

private static void CallCountersUpdated()
{
  if ( CountersUpdated != null ) CountersUpdated();
}

您还可以为 CDCounterUpdated 和 LPCounterUpdated 制作两个事件,而不是一个 CountersUpdated。

在 C# 和 OOP 中拥有一份好工作和好生活。


推荐阅读