1

如何ChangeText在我的静态方法中使用该方法timer_Elapsed

public Load()
{
    InitializeComponent();

    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 1000;

    // I can't transfer parameters here
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    timer.Start();
}

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //Its underlined in red. I need a object reference?
    ChangeText(); 
}

public void ChangeText()
{
    label1.Text = label1.Text + ".";
}
4

6 回答 6

5

我看不出有什么理由timer_Elapsed应该是static。因此,只需将其删除。

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    ChangeText(); //Its not underlined anymore, you have an object reference
}

另一种方法是制作ChangeText静态的。但这不起作用,因为您想设置 a的文本,因此无论如何Label您都需要一个实例。Form

于 2013-03-07T09:34:09.947 回答
3

首先,您的方法(timer_Elapsed)不能让我保持静态,以便使用实例属性(label1)

您的代码中还有一个问题:Timer 创建了另一个线程,大多数 Windows 控件属性只能由 UI 线程修改。您的代码将引发 CrossThreadException。为了解决您的问题,您应该使用以下代码修改您的代码:

if(this.InvokeRequired) {
   BeginInvoke(
       new MethodInvoker(delegate { label.Text+="."; }));
} else {
    label.Text+="."; 
}

问候

于 2013-03-07T09:48:31.270 回答
1

使 ChangeText 成为静态方法。

public static void ChangeText()
于 2013-03-07T09:33:44.550 回答
1

如果不先创建实例,就不能在静态方法中调用实例方法。您必须创建此方法所属的类的实例。如下所示:

var instance = new Load();
instance.ChangeText();  

更新: 正如其他答案所建议的那样,您应该重新考虑将其定义timer_Elapsed为静态。

于 2013-03-07T09:34:05.773 回答
1

仅从静态方法调用静态方法,将您的ChangeText()方法设为静态或将您的time_Elapsed方法设为非静态

于 2013-03-07T09:35:53.310 回答
1

嗨,你可以试试如下:

public Load()
{
    InitializeComponent();

    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 1000;

    // I can't transfer parameters here
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    timer.Start();
}
 private delegate void ChangeLabel();
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            var ChangeLabel = new ChangeLabel(ChangeText);
            this.BeginInvoke(ChangeLabel);

        }
        private void ChangeText()
        {
            label1.Text = label1.Text + ".";
        }
于 2013-03-07T10:14:33.510 回答