如何从多个类访问表单上的标签?

时间:2017-08-12 19:20:26

标签: c# .net winforms

我是C#和表格的初学者,我的练习是创建一个以不同格式写出当前时间的窗口。 但是我一直试图从不同的类中访问表单的不同标签。

布局看起来像这样: clocks layout

所以现在我想要一个标准时钟,一个用二进制写时间的时钟和一个用字母拼出时间的时钟。

我想要做的是为每一个创建一个类来计算所需的内容,然后告诉标签要显示的内容。

所以我使用main函数在Program.cs中创建了一个表单:

Form1 myForm = new Form1();

这可能是不必要的,因为它已经有一些预生成的代码启动Form1(这也是我真正没有得到的部分;是不是需要实例化?):

Application.Run(new Form1());

我尝试使用正常的时钟类:

using System;
using System.Windows.Forms;

namespace Clocks
{
    public class NormalClock
    {
        public NormalClock()
        {
            myForm.lNormalClock.Text = DateTime.Now.ToLongTimeString();
        }
    }
}

但是,这无法访问表单的标签。

所以我的问题是:如何从不同的类中访问一个表单的不同标签?

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

您需要引用您的Form(myform)实例才有机会访问它的标签,但我担心除非您更改它,默认情况下它是受保护的或私有的,所以您赢了&# 39;无论如何都能够做到这一点,除非你改变它的访问修饰符并不是最好的想法。

最好的做法是让任何依赖于某些东西(依赖)的类在构造函数中传递某些东西。 对你而言,它会将Label的实例传递给你的时钟类。

    namespace Clocks
    {
        public class NormalClock
        {
            private Label label;

            public NormalClock(Label label)
            {
                if(label == null)
                    throw new ArgumentNullReferenceException("label");

                this.label = label;
                label.Text = DateTime.Now.ToLongTimeString();
            }
        }
    }

答案 1 :(得分:0)

我认为让钟表了解表格并不是一个好主意。时钟应该做时钟,而不是形成事物。

解决问题的方法有很多种。首先,时钟如何打勾?您将需要一个生成tick事件的计时器。这个计时器都在表格中。然后时钟只读取当前时间并返回表示时间的字符串。然后表单会询问此字符串的时钟。

另一种似乎更好地实现时钟概念的方法是在时钟内部设置一个定时器。现在,计时器如何将时间传达给表单?我再次看到两种可能性。时钟本身暴露事件并提供时间字符串作为事件参数,或者时钟将字符串写入表单。但如上所述,我们不想要后者。

由于您要创建不同类型的时钟,首先要编写一个时钟基类,除了格式化时间字符串外,它还可以执行所有操作。然后,从基类派生的类提供不同类型的时间字符串。

abstract class ClockBase
{
    private Timer _timer = new Timer(); // Create the timer.

    public event EventHandler<ClockTickEventArgs> Tick;

    public ClockBase()
    {
        _timer.Tick += Timer_Tick; // Subscribe to timer tick event.
        _timer.Interval = 1000; // Let the clock tick every 1000 ms.
        _timer.Start(); // Start the timer.
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        string timeString = FormatTime(DateTime.Now); // Format the current date time.
        Tick?.Invoke(this, new ClockTickEventArgs(timeString)); // Fire the Tick event.
    }

    // This will be implemented by concrete clocks.
    protected abstract string FormatTime(DateTime time);
}

正常时钟源自ClockBase并实现格式化时间的方式。

class NormalClock : ClockBase
{
    protected override string FormatTime(DateTime time)
    {
        return time.ToString("hh:mm:ss");
    }
}

表格这样做:

public partial class frmClock : Form
{
    private ClockBase _clock;

    public frmClock()
    {
        InitializeComponent();
        _clock = new NormalClock(); // Create a normal clock.
        _clock.Tick += Clock_Tick; // Subscribe to the clock Tick event.
    }

    private void Clock_Tick(object sender, ClockTickEventArgs e)
    {
        lblTime.Text = e.TimeString; // Set the label text.
    }
}

我们还需要一件事:用作时钟标记事件参数的类:

class ClockTickEventArgs : EventArgs
{
    public ClockTickEventArgs(string timeString)
    {
        this.TimeString = timeString;
    }

    public string TimeString { get; private set; }
}

现在,时钟会对时钟进行计时,表单会显示内容。