0

从 DataGridView 读取然后将数据导出到 RichTextBox 时遇到问题。我制作了一个程序,从 4 个 dataGridView 读取数据并将每个单元格的数据导出到文本框中的字符串。对于小文件,它们工作得很好,但是当我有更大的文件时,我的程序会冻结并且不会显示结果。有什么办法可以解决吗?

我用来读取excel中的单元格的代码:

for (int i = 0; i < dataGridView4.Rows.Count - 1; i++)
{
    if (dataGridView4.Rows[i].Cells["ABC"].Value.ToString() != "")
    {
        richTextBox1.Text += "ABC_ " + dataGridView4.Rows[i].Cells["ABC"].Value.ToString() 
        + " " + dataGridView4.Rows[i].Cells["DEF"].Value.ToString().Replace("\n", "") + ";";
    }
}

当然它会重复这个循环很多次,因为我在 datagridview 中有很多列

4

2 回答 2

4

代替

richTextBox1.Text += "ABC_ " + dataGridView4.Rows[i].Cells["ABC"].Value.ToString() 
                + " " + dataGridView4.Rows[i].Cells["DEF"].Value.ToString().Replace("\n", "") + ";";

利用:

richTextBox1.AppendText("ABC_ " + dataGridView4.Rows[i].Cells["ABC"].Value.ToString() 
                + " " + dataGridView4.Rows[i].Cells["DEF"].Value.ToString().Replace("\n", "") + ";");

它会工作得更快。

除此之外,您可以使用 StringBuilder 代替,您可以在其中附加文本,然后在最后,您可以将该文本设置为richTextBox1。

StringBuilder sb = new StringBuilder();
for (int i = 0; i < dataGridView4.Rows.Count - 1; i++)
{
     if (dataGridView4.Rows[i].Cells["ABC"].Value.ToString() != "")
     {

           sb.Append("ABC_ " + dataGridView4.Rows[i].Cells["ABC"].Value.ToString()
                    + " " + dataGridView4.Rows[i].Cells["DEF"].Value.ToString().Replace("\n", "") + ";");
     }
}
richTextBox1.Text = sb.ToString();
于 2012-11-13T10:29:51.483 回答
0

问题解决了,但我必须解释一下。

NikolaD 的解决方案会快很多,因为该代码不会在大循环中访问复杂的控件(richTextBox)。

表单控件值的任何更新都会触发一些事件。最慢的是屏幕更新。如果你运行这 10000 次 - 这将需要很多时间。

将数据写入(缓冲)到仅存储在 RAM(非常快的内存)中的普通变量、List 或 StringBuilder 的速度要快得多,因为它不必更新显示。

不要尝试每隔几微秒更新一次屏幕,这是不可能的:)

于 2012-11-13T10:46:40.230 回答