【问题标题】:Display different numbers in a textBox在文本框中显示不同的数字
【发布时间】:2018-09-25 16:26:57
【问题描述】:

我想编写一个在textBox 中显示数字110 的代码。以下代码是我写的。但不幸的是,textBox 中只显示了数字 10。我的代码有什么问题?谢谢。

public partial class Form1 : Form
{
    int i,j;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (i = 1; i <= 10; i++)
        {
            textBox1.Text = Convert.ToString(i);
            for (j = 0; j < 10000000; j++) ;
        }
    }
}

【问题讨论】:

  • 每次迭代时都会覆盖 for 循环中的最后一个值 'i'。因此,显示 10,因为这是要迭代的最后一个数字。可能会考虑使用字符串生成器。
  • 当您在 GUI 线程的单个函数中使用此功能时,您将看不到此功能。值会发生变化,但不幸的是,您的代码会阻塞 GUI 线程,并且在“单击”函数结束之前不会显示该值。而函数结束的时候,值已经是10了。

标签: c# loops textbox


【解决方案1】:
textBox1.Text = Convert.ToString(i);

在每个循环中覆盖文本框文本。你想要:

textBox1.Text += Convert.ToString(i) + " ";

注意,还有其他方法可以做到这一点

【讨论】:

    【解决方案2】:

    将文本框的默认值设置为 0,然后在单击按钮时将其递增

     private void button1_Click(object           
        sender, EventArgs e)
        {
    
        textBox1.Text = Convert.ToString(Convert.Int32(textBox1.Text)+1);
        for (j = 0; j < 10000000; j++) ;
        {
    
        }
     }
    

    【讨论】:

      【解决方案3】:

      您不应该在 GUI 线程中工作。当你有一些简单的工作(小计算)时,就没有问题了。但是当你有一个单独的工作时,将工作转移到后台工作人员。

      这是正确的做法:

      using System;
      using System.ComponentModel;
      using System.Threading;
      using System.Windows.Forms;
      
      namespace BackgroundWorkerExample
      {
        public partial class Form1 : Form
        {
          private BackgroundWorker worker;
      
          public Form1()
          {
            InitializeComponent();
            this.worker = new BackgroundWorker();
            this.worker.DoWork += Worker_DoWork;
            this.worker.ProgressChanged += Worker_ProgressChanged;
            this.worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
            this.worker.WorkerReportsProgress = true;
          }
      
          private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) => this.button1.Enabled = true;
      
          private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
          {
            this.textBox1.Text = e.ProgressPercentage.ToString();
          }
      
          private void Worker_DoWork(object sender, DoWorkEventArgs e)
          {
            for (int i = 0; i <= 10; i++)
            {
              this.worker.ReportProgress(i);
      
              // do work
              Thread.Sleep(1000);
            }
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
            this.button1.Enabled = false;
            this.worker.RunWorkerAsync();
          }
        }
      }
      

      按钮(操作开始后)被禁用为非活动状态。原因是,为了防止后台线程的try第二次执行。当后台工作人员结束时,按钮被启用。

      【讨论】:

      • @Greg:是的,有点复杂,但是当你需要在处理数据的同时显示一些东西时,这是正确的方法。第二种可能的方式 (在 GUI 线程中执行工作) 不是这样做的好方法。
      • 恕我直言,这对于新开发人员来说不仅仅是“有点复杂”,即使这是正确的方法。当我还在初级学习时,这会让我感到困惑,而不是告诉我为什么会出现这个问题。
      • 我希望它不是那么复杂,它会太混乱。不幸的是,我见过(或者更好地说,是电子邮件技术支持)“经验丰富”的程序员,他们已经运行了几秒钟(最长可达 70 秒) i> 按下按钮后 GUI 线程中的任务。我说,不幸的是,它们不是具有冻结 GUI 线程“功能”的廉价程序。因此,最好从一开始就教授正确的思维方式。
      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      相关资源
      最近更新 更多