从Datagridview读取到TextBox的快速方法

时间:2012-11-13 10:21:17

标签: c# datagridview textbox readfile

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

我的代码用于读取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中有很多列

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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

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

将(缓冲环)数据写入正常变量,List或StringBuilder只是存储在RAM(非常快的内存)中要快得多,因为它不需要更新显示。

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