1

How can I use the method ChangeText in my static method 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静的にすることです。ただし、 aLabelの Text を設定する必要があるため、それは機能しませFormん。とにかく、のインスタンスが必要です。

于 2013-03-07T09:34:09.947 に答える
3

まず、インスタンス プロパティ (label1) を使用するために、メソッド (timer_Elapsed) を静的にできませんでした。

コードには別の問題があります。タイマーは他のスレッドを作成します。ほとんどのウィンドウ コントロール プロパティは、UI スレッドによってのみ変更できます。コードは CrossThreadException をスローします。問題を解決するには、コードを次のように変更する必要があります。

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

よろしく

于 2013-03-07T09:48:31.270 に答える
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 に答える
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 に答える