0

ボタンをクリックすると、複数のメソッドを次々に実行したい。クリックボタンをクリックして、キュー内の次のメソッドを実行できるようにします。

メッセージボックスは私が望むことを正確に実行しますが、私はメッセージボックスが嫌いです。

これは私が実装しようとしているものです:

private void teststart_Click(object sender, EventArgs e)
{
    step1();
    //Wait for button to be clicked
    step2();
    //wait for button to be clicked
    step3();
    //wait for button to be clicked

}

private void continuebutton_Click(object sender, EventArgs e)
{
    //button to be clicked
}
4

5 に答える 5

1

静的変数(つまり、歩数)を維持でき、正しいボタンが押されるたびに、歩数を増やします。

static int _step = 0;

private void teststart_Click(object sender, EventArgs e) 
{ 
    if(_step > 0)
    {
      // already started
      return;
    }
    step1(); 
    _step++;

} 

private void continuebutton_Click(object sender, EventArgs e) 
{ 
    if(_step == 0) 
    {  
        // start button must be pushed first
        return;
    }

    if(_step == 1)
    {
      step2(); 
      _step++;
    }
    else
    {
      step3(); .
      _step = 0;  // start over
    } 
} 
于 2012-08-04T15:06:47.010 に答える
1

キューを作成し、ステップ関数を委任します。ボタンをクリックするとデリゲート(ステップリターン文字列)をエンキューするサンプルを実行しました。これにより、すべてのステップを含むキューがデキューされます。

  using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public  delegate string mystep ();
        public Queue<mystep> queuestep;
        public Form1()
        {
            InitializeComponent();
            queuestep = new Queue<mystep>();
            queuestep.Enqueue(step1);
            queuestep.Enqueue(step2);
            queuestep.Enqueue(step3);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (queuestep.Count >0)
            {
           mystep currentstep =  queuestep.Dequeue();
           textBox1.Text =currentstep();
           }
        }

        private string step1()
        {
            return "step1";
        }
        private string step2()
        {
            return "step2";
        }
        private string step3()
        {
            return "step3";
        }
    }
}
于 2012-08-04T15:36:53.760 に答える
1

私の特定の解決策については、上記の解決策から始めました。さらにグーグルした後、私は簡単な方法がすることであることがわかりました

do
{Application.Doevents()}
while (step == false)

これで見つけた唯一のバグは、ボタンを2回クリックする必要があったため、ボタンを無効にしました。これはとにかくやりたかったのですが、後で再度有効にしました。これは悪いコーディングだと読みましたが、この目標を達成するためのより簡単な方法をまだ見つけていません。

于 2012-09-06T02:35:46.977 に答える
0

これは特にC#ではありませんが、これがあなたが望むことを行うことができる方法です。

Step整数型などのクラス変数を保持します。continuebutton_click-Method内で、を確認Step % 2 == 0し、そうである場合は、(スイッチ/ケースなどを使用して)次のメソッドをトリガーし、ステップを1つずつインクリメントします。メソッドが完了したら、ステップ数をもう一度増やします。

そうすれば、メッセージボックスを使用せずに目的の動作を得ることができます。

于 2012-08-04T15:06:59.873 に答える
0

その醜いが動作します、アドバイスに感謝します。コードは私が望むことを正確に実行します。私はこれをやってのけるよりエレガントな方法があると確信していますが、述べたように私はまだ初心者であり、これはうまくいきます。

        step++;
        if (step == 502 || step == 392 || step == 305 || step == 14 || step == 313 ||          step == 324 || step == 332 || step == 344 || step == 357 || step == 363 || step == 373 || step == 384 || step == 122 || step == 408 || step == 222)
        {defaults();}

        if (step == 300)
        {firstlo();}

        if (step == 1 || step == 301)
        {firstlo1();}

        if (step == 2 || step == 302)
        {firstlo2();}

        if (step == 3 || step == 303)
        {firstlo3();}

        if (step == 4)
        {loinband();}

        if (step == 5 || step == 311)
        {loinband1();}

        if (step == 6)
        { secondlo();}

        if (step == 7 || step == 321)
        { secondlo1(); }

        if (step == 8 || step == 322)
        { secondlo2(); }

        if (step == 9)
        {currents();}

        if (step == 10)
        {outputpower();}

        if (step == 11 || step == 341)
        { outputpower1(); }

        if (step == 12 || step == 342)
        { outputpower2(); }

        if (step == 215)
        {satatt();}

        /*if (step == 351)
        { satatt1(); }*/

        if (step == 351 || step == 101 || step == 216)
        { satatt2(); }

        if (step == 352 || step == 102 || step == 217)
        { satatt3(); }

        if (step == 353 || step == 103 || step == 218)
        { satatt4(); }

        if (step == 354 || step == 104 || step == 219)
        { satatt5(); }

        if (step == 355 || step == 105 || step == 220)
        { satatt6(); }

        if (step == 106 || step == 211)
        { lineargain(); }

        if (step == 361 || step == 107 || step == 212)
        { lineargain1(); }

        if (step == 108 || step == 213)
        { compression(); }

        if (step == 109 || step == 371 || step == 214)
        { compression1(); }

        if (step == 110 || step == 208)
        { outputinband(); }

        if (step == 111 || step == 381 || step == 209)
        { outputinband1(); }

        if (step == 112 || step == 382 || step == 210)
        { outputinband2(); }

        if (step == 113 || step == 207)
        { ifrl(); }

        if (step == 114)
        { twotone(); }

        if (step == 115 || step == 401 || step == 201)
        { twotone1(); }

        if (step == 116 || step == 402 || step == 202)
        { twotone2(); }

        if (step == 117 || step == 403 || step == 203)
        { twotone3(); }

        if (step == 118 || step == 404 || step == 204)
        { twotone4(); }

        if (step == 119 || step == 405 || step == 205)
        { twotone5(); }

        if (step == 120 || step == 406 || step == 206)
        { twotone6(); }

        if (step == 304 || step == 13 || step == 501 || step == 312 || step == 323 || step == 331 || step == 343 || step == 356 || step == 362 || step == 372 || step == 383 || step == 391 || step == 121 || step == 407 || step == 221)
        {
            cont.Hide();
            instructions.Text = "Test Complete\n\n\nPress continue to return program to start condition\nor close program.";</code>
于 2012-08-05T18:14:51.930 に答える