C# 在C中将数据写入文本框时显示进度条#

C# 在C中将数据写入文本框时显示进度条#,c#,textbox,progress-bar,C#,Textbox,Progress Bar,我要写一个长文本到一个文本框,屏幕冻结了很长时间。 所以我想在将文本写入文本框时显示进度条。对我的代码有什么建议吗?谢谢大家! private void btnCheckProcStep_Click(object sender, EventArgs e) { try { txtResults.Clear(); DataTable dtx = new DataTable(

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

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());
            }            
        }

您可以计算在等于全部(设置为100或您自己的选择,它被称为最大值)之前需要添加到进度中的次数。我可以通过进度条来实现这一点,所需的更改将是100(或最大值)除以DataRow中的行数

ProgBarChange = progBar.Maximum / DataRow.Count()
然后在你的Foreach中,我会使用这个ProgBarChange值增加你的progressbar

progBar.Value += ProgBarChange;
请记住清除程序栏,就像清除txtResults.clear()一样


您应该使用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;
        }
    }
}
delegate void SetTextCallback(字符串文本);
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
backgroundWorker1.WorkerReportsProgress=true;
backgroundWorker1.DoWork+=新的DoWorkerVenthandler(backgroundWorker1_DoWork);
backgroundWorker1.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
无效backgroundWorker1\u DoWork(对象发送方,DoWorkerVentargs e)
{
//你的背景任务在这里

对于(int i=0;i您应该使用BackgroundWorker来更新进度。

这是客户端功能。如果可能,请尝试下面的简单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>

#进度条{
宽度:100%;
背景色:#ddd;
}
#酒吧{
宽度:1%;
高度:30px;
背景色:#4CAF50;
}
函数showProgress(){
var元素=document.getElementById(“Bar”);
var宽度=1;
var id=设置间隔(第10帧);
函数框架(){
如果(宽度>=100){
清除间隔(id);
}否则{
宽度++;
element.style.width=width/2+'%';
}
}
}


您在服务器端使用它,这是一个前端功能!不要在一个周期内使用字符串+字符串。用
StringBuilder
替换它,速度会快得多。这是Windows Form,这如何回答他的问题?哦,我想我看到了#wpf标签。是的,我们需要看看他在使用什么。我正在使用Windows Form谢谢,但在我的情况下如何使用您的代码。这是Windows窗体当然也是Windows窗体代码//您的后台任务在本节中转到这里您可以使用数据库查询并执行代码Windows窗体请!
<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>