如何有效地将数据填充到winform DataGridView异步?

时间:2016-09-21 08:27:33

标签: c# winforms datagridview

我正在开发一个Word-Addin项目(仅供参考,特别是在性能方面)。我有一个DataGridView,我在运行时填充数据。 问题是我在DataGridView中填充的大量数据(通常以百万计)来自一个webService调用,这个调用在响应调用时不可避免需要10-20秒。 gridView上还有搜索功能,我不想调用web-Service,因为我知道DataGridView在搜索GridView时非常有效。我希望以异步方式填充数据,以便最终用户不必等待响应,并且单词也不会冻结。 我可以使用线程池以异步方式填充数据,但搜索功能可能不明确。 任何想法如何处理这种情况? 我感谢任何帮助。 谢谢 此致

1 个答案:

答案 0 :(得分:0)

您可以使用VirtualMode。这是做什么的 当您的DataGridView想要显示一个项目时,它会从事件中获取它而不是立即加载它们

    // Enable virtual mode.
    this.dataGridView1.VirtualMode = true;

    // Connect the virtual-mode events to event handlers. 
    this.dataGridView1.CellValueNeeded += new
        DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);
    this.dataGridView1.CellValuePushed += new
        DataGridViewCellValueEventHandler(dataGridView1_CellValuePushed);
    this.dataGridView1.NewRowNeeded += new
        DataGridViewRowEventHandler(dataGridView1_NewRowNeeded);
    this.dataGridView1.RowValidated += new
        DataGridViewCellEventHandler(dataGridView1_RowValidated);
    this.dataGridView1.RowDirtyStateNeeded += new
        QuestionEventHandler(dataGridView1_RowDirtyStateNeeded);
    this.dataGridView1.CancelRowEdit += new
        QuestionEventHandler(dataGridView1_CancelRowEdit);
    this.dataGridView1.UserDeletingRow += new
        DataGridViewRowCancelEventHandler(dataGridView1_UserDeletingRow);

CellValueNeeded可能看起来像这样

private void dataGridView1_CellValueNeeded(object sender , DataGridViewCellValueEventArgs e)
{
    e.Value = $"Row {e.RowIndex} , Column {e.ColumnIndex}";
}