在按钮上设置计时器

时间:2014-02-06 07:22:46

标签: c#

我已经动态创建了一些按钮,我想逐个显示所有这些按钮。 我怎么能使用延迟功能。我在循环中使用thread.sleep。但它会延迟所有按钮,但我想延迟每个按钮。我正在使用C#visual studio 2012

for (int i = 0; i < 10; i++)
{               
   btn[i] = new Button();
   btn[i].Text = i.ToString();
   btn[i].Click += Form1_Click;
   this.flowLayoutPanel1.Controls.Add(btn[i]);
   System.Threading.Thread.Sleep(1000);
}  //closing of code 

2 个答案:

答案 0 :(得分:3)

您目前正在阻止UI线程 - 请勿这样做。

相反,我建议您使用计时器。例如:

class Foo : Form
{
    private int nextButtonToShow = 0;
    private Timer timer;
    private Button[] buttons;

    internal Foo()
    {
        timer = new Timer();
        timer.Tick += ShowNextButton;
        timer.Interval = 1000;
        timer.Enabled = true;
    }

    private void ShowNextButton(object sender, EventArgs e)
    {
        // TODO: Set location etc
        Button button = new Button { Text = nextButtonToShow.ToString() };
        button.Click += ...;
        buttons[i] = button;
        Controls.Add(button);
        nextButtonToShow++;
        if (nextButtonToShow == buttons.Length)
        {
            timer.Enabled = false;
        }
    }
}

(您应确保在处理表格时丢弃计时器。)

答案 1 :(得分:1)

我会使用微软的反应框架(在NuGet上寻找Rx-Main)。

var addButtons =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Take(10)
        .ObserveOn(SynchronizationContext.Current);

addButtons.Subscribe(i =>
{
    btn[i] = new Button();
    btn[i].Text = i.ToString();
    btn[i].Click += Form1_Click;
    this.flowLayoutPanel1.Controls.Add(btn[i]);
});