在静态方法中使用其他方法
本文关键字:其他 方法 静态方法 | 更新日期: 2023-09-27 18:02:37
如何在静态方法timer_Elapsed
中使用方法ChangeText
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 + ".";
}
我看不出timer_Elapsed
应该是static
的任何理由。所以直接把它删掉。
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
ChangeText(); //Its not underlined anymore, you have an object reference
}
另一种方法是将ChangeText
设置为静态。但这将不起作用,因为你想设置一个Label
的文本,所以你需要一个Form
的实例。
首先,您的方法(timer_Elapsed)不能静态,以便使用实例属性(label1)
在你的代码中还有一个问题:定时器创建了一个其他线程,大多数windows控件属性只能通过UI线程修改。你的代码会抛出一个CrossThreadException。为了解决您的问题,您应该这样修改代码:
if(this.InvokeRequired) {
BeginInvoke(
new MethodInvoker(delegate { label.Text+="."; }));
} else {
label.Text+=".";
}
对
将ChangeText设置为静态方法
public static void ChangeText()
只能从静态方法调用静态方法,要么将ChangeText()
方法设置为静态,要么将time_Elapsed
方法设置为非静态
如果不先创建实例,就不能在静态实例中调用实例方法。您必须创建此方法所属类的实例。像下图:
var instance = new Load();
instance.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();
}
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 + ".";
}