我在从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中有很多列
答案 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(非常快的内存)中要快得多,因为它不需要更新显示。
不要每隔几微秒尝试更新一次屏幕,这是不可能的:)