将DataGrid.dataSource分配给数据表对象时,DataGrid视图会花费大量时间



我有一个名为"dataTableJobHistory"的数据表和一个名"dgvJobEditsHistory"。数据表从SQL查询中获取数据,有时行数为500,有时为10000+。。

当记录大约为500时,我标记的网格视图加载大约需要30秒,当记录为2000时大约需要4分钟,并且随着数据表的增加而增加。

在呈现gridView之前,它被分配给数据表的结果,而数据表是调试器花费大量时间的地方。

///////(dgvJobEditsHistory.DataSource = dataTableJobHistory;)////herer it takes time..see below
if (dataTableJobHistory != null && dataTableJobHistory.Rows.Count > 0)
{
dgvJobEditsHistory.DataSource = dataTableJobHistory;                    
dgvJobEditsHistory.RowHeadersWidth = 30;
dgvJobEditsHistory.Columns[1].Width = 130;
dgvJobEditsHistory.Columns[2].Width = 140;
dgvJobEditsHistory.Columns[3].Width = 130;
jobId.Text += imJob.ID.ToString();
jobName.Text += imJob.Name.ToString();
CreatedBy.Text += imJob.UserCreated;
CreatedDate.Text += imJob.DateCreated.ToString();
this.Cursor = Cursors.Default;
}

我甚至尝试将代码修改为--

dgvJobEditsHistory.DataSource = null;
dgvJobEditsHistory.ColumnHeadersVisible = false;
dgvJobEditsHistory.DataSource = dataTableJobHistory;
dgvJobEditsHistory.ColumnHeadersVisible = true;

但这仍然需要同样的时间。

这个问题没有太多的资源,而且确实很痛苦。如有任何帮助,我们将不胜感激。

此外,当它到达绑定数据表的位置时,将执行以下代码,并且从代码中出来需要时间-

private void dgvJobEditsHistory_SelectionChanged(object sender, EventArgs e)
{
try
{
if (dgvJobEditsHistory != null && dgvJobEditsHistory.Rows.Count > 0 && dgvJobEditsHistory.SelectedRows != null)
{
int index = dgvJobEditsHistory.CurrentCell.RowIndex;
DataGridViewRow drgRow = dgvJobEditsHistory.Rows[index];
if (drgRow != null)
{
if (dgvJobEditsHistory.SelectedRows.Count > 1)
{
dicCollection = new Dictionary<long, string>();
foreach (DataGridViewRow row in dgvJobEditsHistory.SelectedRows)
{
dicCollection.Add((Convert.ToInt64(row.Cells[JobResource.FieldFID].Value)), (row.Cells[JobResource.FieldFClassName].Value.ToString()));
}
}
else
{
dicCollection = new Dictionary<long, string>();
dicCollection.Add((Convert.ToInt64(drgRow.Cells[JobResource.FieldFID].Value)), (drgRow.Cells[JobResource.FieldFClassName].Value.ToString()));
}
oldValue = index;
fidFeature = drgRow.Cells[JobResource.FieldFID].Value.ToString();
string featureClassName = drgRow.Cells[JobResource.FieldFClassName].Value.ToString();
string jobOperationType = drgRow.Cells[JobResource.FieldJobOperationType].Value.ToString();//INSERT, UPDATE, DELETE
activeJob = imJob;
Job liveJob = imCurrentDocument.Connection.Jobs[JobResource.JobStateLive];
using (dtFeatureEditHistory = GetFeatureEditHistory(liveJob, activeJob, fidFeature, featureClassName, jobOperationType))
{
if (dtFeatureEditHistory != null)
{
dataGridViewFeatureEdits.DataSource = dtFeatureEditHistory;
}
}
if (dataGridViewFeatureEdits.Rows.Count > 0)
{
lst = new ArrayList();
attributeCount = new ArrayList();
for (int iRow = 0; iRow < dataGridViewFeatureEdits.Rows.Count; iRow++)
{
attributeCount.Add(dataGridViewFeatureEdits.Rows.Count);
DataGridViewCell activeJobValue = dataGridViewFeatureEdits.Rows[iRow].Cells[1];
DataGridViewCell liveJobValue = dataGridViewFeatureEdits.Rows[iRow].Cells[2];
if (activeJobValue.Value.ToString() != liveJobValue.Value.ToString())
{
dataGridViewFeatureEdits.Rows[iRow].Cells[1].Style.ForeColor = Color.Red;
lst.Add(iRow);
activeJobValue.Style.ForeColor = Color.Red;
liveJobValue.Style.ForeColor = Color.Red;
}
}
dataGridViewFeatureEdits.RowHeadersWidth = 30;
dataGridViewFeatureEdits.Columns[0].Width = 130;
dataGridViewFeatureEdits.Columns[1].Width = 157;
dataGridViewFeatureEdits.Columns[2].Width = 157;
}
}
}
}

属性

this.dgvJobEditsHistory.AllowUserToAddRows = false;
this.dgvJobEditsHistory.AllowUserToDeleteRows = false;
this.dgvJobEditsHistory.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dgvJobEditsHistory.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgvJobEditsHistory.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.dgvJobEditsHistory.CausesValidation = false;
this.dgvJobEditsHistory.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvJobEditsHistory.Cursor = System.Windows.Forms.Cursors.Arrow;
this.dgvJobEditsHistory.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvJobEditsHistory.Location = new System.Drawing.Point(3, 16);
this.dgvJobEditsHistory.Name = "dgvJobEditsHistory";
this.dgvJobEditsHistory.ReadOnly = true;
this.dgvJobEditsHistory.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
this.dgvJobEditsHistory.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dgvJobEditsHistory.Size = new System.Drawing.Size(704, 236);
this.dgvJobEditsHistory.TabIndex = 0;
this.dgvJobEditsHistory.SelectionChanged += new System.EventHandler(this.dgvJobEditsHistory_SelectionChanged);

这将表现良好。在我的机器上设置包含100000个项目的数据源需要0.19秒。这是一个独立的windows应用程序;你可以创建一个新项目,只需将整个代码粘贴到Form1.cs中的顶部,然后运行它:

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
DataGridView _dgv;
public Form1()
{
InitializeComponent();
_dgv = new DataGridView();
_dgv.Width = 400;
_dgv.Height = 400;
_dgv.Location = new Point(0, 0);
this.Controls.Add(_dgv);
this.Size = new Size(500, 500);
Button b = new Button();
b.Click += BClick;
b.Location = new Point(400, 400);
this.Controls.Add(b);
}
private void BClick(object sender, EventArgs e)
{

DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
for (int i = 0; i < 100000; i++)
{
dt.Rows.Add(new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() });
}
DateTime x = DateTime.Now;
_dgv.DataSource = dt;
this.Text = "adding ds took " + (DateTime.Now - x).TotalSeconds;
}
}
}

设置数据源时,您的机器一定在做大量无用的工作;使用调试器找出原因。。

或者重新开始,使用这个干净的例子,然后不断添加一些东西(比如dgv事件处理程序(,直到它突然达到性能墙

我曾经遇到过同样的问题,我的网格视图加载7000条记录需要大约7秒,这是非常不寻常的。当我对此做了一些研究时,发现gridview的AutoSizeRowsMode属性是罪魁祸首,当它的集合试图为添加的每个新记录调整行长度时。

请确保网格视图的AutoSizeRowsMode和AutoSizeColumnsMode属性设置为false,然后重试。

最新更新