【问题标题】:Display Progress bar when writing data into textbox in C#在 C# 中将数据写入文本框时显示进度条
【发布时间】:2018-05-18 20:15:03
【问题描述】:

我要在一个文本框中写一个长文本,屏幕冻结了很长时间。 所以我想在将文本写入文本框时显示进度条。我的代码有什么建议吗?谢谢!

private void btnCheckProcStep_Click(object sender, EventArgs e)
        {
            try
            {
                txtResults.Clear();
                DataTable dtx = new DataTable();             
                foreach (DataGridViewRow row in grdMametanCheckList.Rows)
                {
                    var _MAMETAN_NO = row.Cells[0].Value.ToString();
                    dtx = get_Missing_Proc_Inst_Seq(_MAMETAN_NO);
                    foreach (DataRow dr in dtx.Rows)
                    {
                        txtResults.Text += row.Cells[0].Value.ToString()+ ","+ dr[0].ToString() + Environment.NewLine;
                    }                   
                }   
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());
            }            
        }

【问题讨论】:

  • 你在做服务器端,它是一个前端功能!
  • 不要在循环中使用字符串+字符串。换成StringBuilder会快很多。
  • 它是 Windows 窗体

标签: c# textbox progress-bar


【解决方案1】:

你应该使用BackgroundWorker来进行aysnc进程

delegate void SetTextCallback(string text);
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }
    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Your background task goes here
        for (int i = 0; i <= 100; i++)
        {
            SetText(i.ToString()+" %");
            backgroundWorker1.ReportProgress(i);
            System.Threading.Thread.Sleep(100);
        }
    }
    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("MEssagebox");
    }
    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void SetText(string text)
    {
        if (this.textBox1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text = text;
        }
    }
}

注意:当数据从数据库中检索并写入文本框时,需要继续运行进度条。

【讨论】:

  • 谢谢,但就我而言,我该如何使用您的代码。它是 Windows 窗体
  • off-course它也是一个windows窗体代码 //你的后台任务在这里 在这个部分你可以使用你的数据库查询和执行代码
【解决方案2】:

您可以计算在等于满之前您需要增加多少次进度(设置为 100 或您的选择,称为最大值)。我会这样做,需要的进度条更改将是 100(或最大值)除以 DataRow 中的行数。

ProgBarChange = progBar.Maximum / DataRow.Count()

然后在你的 Foreach 中,我会使用这个 ProgBarChange 值增加你的进度条。

progBar.Value += ProgBarChange;

记得像使用 txtResults.Clear() 一样清除 progBar。

progBar.Value = 0;

【讨论】:

  • 这如何回答他的问题?
  • 哦,我以为我看到了#wpf 标签。是的,我们需要看看他在用什么
  • 我使用的是 Windows 窗体
【解决方案3】:

您应该使用 BackgroundWorker 来更新进度。

【讨论】:

    【解决方案4】:

    这是一个客户端功能。如果可能,请尝试以下简单的 java 脚本进度条。

    <html>
    <head>
        <style>
            #ProgressBar {
                width: 100%;
                background-color: #ddd;
            }
            #Bar {
                width: 1%;
                height: 30px;
                background-color: #4CAF50;
            }
        </style>
        <meta charset="utf-8" />
        <script>
            function showProgress() {
                var element = document.getElementById("Bar");
                var width = 1;
                var id = setInterval(frame, 10);
                function frame() {
                    if (width >= 100) {
                        clearInterval(id);
                    } else {
                        width++;
                        element.style.width = width / 2 + '%';
                    }
                }
            }
        </script>
    </head>
    <body>
        <div id="ProgressBar">
            <div id="Bar"></div>
        </div>
        <br>
        <input type="text" id="txtResults" onkeypress="showProgress()" />
    </body>
    </html>
    

    【讨论】:

    • Windows 窗体请!
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多