c#填充列表框时填充文本框

时间:2017-06-15 07:45:19

标签: c# winforms

这是我的代码:

private void _1_Load(object sender, EventArgs e)
{
    FillA();
    FillB();
    // Tried these lines too but they show listbox values but not textbox value
    //    var t2 = Task.Run(() => FillA());
    //    FillB();    
}

private void FillA()
{
    this.Invoke(new MethodInvoker(delegate()
    {
        for (int i = 1; i > 0; i++)
        {
            listBox1.Items.Add(i.ToString());
            listBox1.Update();
            Thread.Sleep(25);
        }
    }));
}

private void FillB()
{
    Thread.Sleep(3000); //1 seconds delay
    textBox1.Text = "Hello World!";
}

当页面加载时,listbox应该开始显示数字1,2,3 ...然后在几秒钟的延迟后,文本框应该显示Hello World!值,但列表框应该保持增长。如何确保首先列表框应该开始填充,然后文本框应该填充。我不想等待填充列表框,然后填写文本框。

任何建议都将受到赞赏。

修改 这只是一个示例代码。在实际生产中,将有两个进程,第二个进程将在第一个进程开始获取数据并存储在列表框中时启动。

第一个过程应继续进行。我无法在中间停止它,因为它会在数据中造成不一致。

3 个答案:

答案 0 :(得分:1)

不要使用睡眠。而是使用Timer-class:

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

  • 配置超时1秒。

  • 连接计时器的Elapsed事件:

    aTimer.Elapsed += OnTimedEvent;
    
  • 在方法OnTimedEvent中,您可以增加整数变量 i

  • 根据 i 的值,您填写第一个列表框,如果值更高,请填写另一个列表框。

答案 1 :(得分:0)

您无法一次性将所有项目添加到列表框中并更新文本框,因为这些操作在WindowsForms中同步完成。

相反,您应该只将一部分项目添加到列表框中,更新文本框,然后继续将项目添加到列表框中。

要在等待操作之间不冻结GUI,您可以使用async\await组合而不是Thread.Sleep()

private async void _1_Load(object sender, EventArgs e)
{
    await AddInitialListBoxItems();
    await FillTextBox();
    await AddRemainingListBoxItems();
}

private async Task AddInitialListBoxItems()
{
    for (int i = 1; i < 10; i++)
    {
        listBox1.Items.Add(i.ToString());
        listBox1.Update();
        await Task.Delay(25);
    }
}

private async Task FillTextBox()
{
    await Task.Delay(3000); //1 seconds delay
    textBox1.Text = "Hello World!";
}

private async Task AddRemainingListBoxItems()
{
    for (int i = 11; i < 100; i++)
    {
        listBox1.Items.Add(i.ToString());
        listBox1.Update();
        await Task.Delay(25);
    }
}

答案 2 :(得分:0)

如果您可以使用Timer而不是直接线程,这可能会对您有所帮助。它在我的电脑上运行:

编辑,因为您需要在延迟一段时间后写入文本框,您还需要使用计时器。我编辑了下面的代码。文本框是在列表框填充开始1秒后写入的。

public partial class Form1 : Form
{
    int counter = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        timer.Interval = 25;
        timer.Tick += Timer_Tick;
        timer.Start();

        System.Windows.Forms.Timer timerTextbox = new System.Windows.Forms.Timer();
        timerTextbox.Interval = 1000;
        timerTextbox.Tick += TimerTextbox_Tick; ;
        timerTextbox.Start();


    }

    private void TimerTextbox_Tick(object sender, EventArgs e)
    {
        FillB();
        (sender as System.Windows.Forms.Timer).Stop();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        listBox1.Items.Add(counter.ToString());
        counter++;
        listBox1.Update();
    }

    private void FillB()
    {
      textBox1.Text = "Hello World!";
    }

}

当然,当您在Thread.Sleep(3000); //1 seconds delay事件(3000毫秒是3秒btw)上致电Load时,您的表单会在3秒后显示。