用大量数据填充DataGridView的最佳方法

我有一个Windows窗体,有两个DataGridViews(DGV),每个将包含25,000多条记录和21列。 我已经使用DataAdapter成功地从数据库加载了数据,然后我尝试使用for循环填充DGV。 每种方法花费的时间大致相同。 第一次将数据填入DGV时需要太长时间(7分钟以上),然后随后的时间更合理(~30秒)。 所以我的问题是,加载具有大量数据的DGV的最佳方法是平均<= 1分钟? 我非常喜欢DGV的功能,但是如果推动推动我愿意使用不同的技术,即使这意味着放弃了一些功能。

基本上有3种方法可以在DataGridView显示数据

  • 正如您目前所做的那样,在循环中手动创建行:正如您所注意到的,如果您拥有大量数据,效率非常低

  • 使用DataGridView的虚拟模式,如Jonathan在其评论中所建议的:DGV只创建可显示的行数,并在用户滚动时动态更改其内容。 您需要处理CellValueNeeded事件以向DGV提供所需的数据

  • 使用数据绑定:这是迄今为止最简单的方法。 您只需使用DbDataAdapter使用数据库中的数据填充DataTable ,并将此DataTable分配给DGV的DataSource属性。 DGV可以自动创建列( AutoGenerateColumns = true ),也可以手动创建它们(必须将列的DataPropertyName设置为要显示的字段的名称)。 在数据绑定模式下,DGV的工作方式与虚拟模式类似,只是它负责从数据源中获取数据,因此您无需执行任何操作。 即使对于大量行,它也非常有效

我认为您可以使用DataReader方法而不是DataAdapter。 DataReader是非常高效的单向组件,因为它只从源读取数据,您可以使用循环填充数据表。

如果你有大量的行,比如10 000或更多,

避免性能泄漏 – 在数据绑定之前执行以下操作:

 dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; //or even better .DisableResizing. //Most time consumption enum is DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders dataGridView1.RowHeadersVisible = false; // set it to false if not needed 

数据绑定后,您可以启用它。

尝试使用DataTable。 填充。 然后使用DataView。 将其分配给DataGridView DataSource。

 //DataView dataView = new DataView(dataTable); //this.Grid.DataSource = dataView; 

对于大文件(一秒钟内有25000条记录和21列),您将获得非常小的响应时间。 我的模板程序需要7秒才能加载100 000行* 100列{含有愚蠢的内容 – >行号作为字符串}

这解决了我的问题:

 array ^theRows = nullptr; if (DG->Rows->Count == 0)//First Compilation { int NUMROWS = xxx; theRows = gcnew array(NUMROWS); for (int nr = 0; nr < DRH->Count; nr++) theRows[nr] = gcnew DataGridViewRow(); //Do not remove the two following DG->Rows->AddRange(theRows); DG->Rows->Clear(); } else //Update { theRows = gcnew array(DG->Rows->Count); DG->Rows->CopyTo(theRows, 0); DG->Rows->Clear(); } for(int nr=0;nrLength;nr++) { theRows [nr]->SetValues("val1", "val2"); } DG->Rows->AddRange(theRows); 

我不确定这是你所要求的,但我喜欢创建一个数据子集来进行内部加载,然后包括搜索function。 使用visual studio 15和DataSources /数据集非常容易。 在解决方案资源管理器中,打开您的dataset.xsd文件。 它将命名为DataSet.xsd转到相关数据表。 单击鼠标右键,然后添加查询。 我通常做的一件事就是在我的查询中添加“TOP 1000”。 因此,从mytable中选择*将从mytable中选择TOP 1000 *

最后,双击表单以查找_load方法,并更改“填充”以使用新查询。 通过示例可以最好地certificate这一点:

我注释掉的第一行代码是Vis Stud默认创建的代码。 第二个是我添加的,它只会获得前1000个记录。

  private void Form_Customers_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'stage2DataSet.customers' table. You can move, or remove it, as needed. /* this.customersTableAdapter.Fill(this.stage2DataSet.customers); */ this.customersTableAdapter.FillBy_Top_1000(this.stage2DataSet.customers); }