如何在静态方法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 + ".";
}
答案 0 :(得分:5)
我认为timer_Elapsed
应该是static
的原因没有任何理由。所以只需将其删除即可。
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
ChangeText(); //Its not underlined anymore, you have an object reference
}
另一种方法是使ChangeText
静态。但是,由于您要设置Label
的文本,因此无法使用,因此您无论如何都需要Form
的实例。
答案 1 :(得分:3)
首先,你的方法(timer_Elapsed)不能是静态的,以便使用实例属性(label1)
您的代码中还有一个问题:Timer创建另一个线程,大多数Windows控件属性只能由UI线程修改。您的代码将抛出CrossThreadException。 为了解决您的问题,您应该使用以下代码修改代码:
if(this.InvokeRequired) {
BeginInvoke(
new MethodInvoker(delegate { label.Text+="."; }));
} else {
label.Text+=".";
}
此致
答案 2 :(得分:1)
使ChangeText成为一种静态方法。
public static void ChangeText()
答案 3 :(得分:1)
如果不首先创建实例,则无法在静态方法中调用实例方法。您必须创建此方法所属的类的实例。如下所示:
var instance = new Load();
instance.ChangeText();
更新的
正如其他答案所示,您应该重新考虑将timer_Elapsed
定义为静态。
答案 4 :(得分:1)
只从静态方法调用静态方法,
将您的ChangeText()
方法设为静态或将time_Elapsed
方法设为非静态方法
答案 5 :(得分: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 + ".";
}