dataGridView虚拟模式的性能问题 [英] Performance issues with dataGridView Virtual Mode
本文介绍了dataGridView虚拟模式的性能问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发一个未绑定的C#WinForm dataGridView并实现虚拟模式。当用户滚动将数据呈现到新行时,我正在实时启动查询并出现性能问题。我的winForm冻结,我的内存不断增长,每个滚动/查询和CPU使用率接近50%。这是一个代码示例。我在这里做错了什么?
I'm working on a C# WinForm dataGridView that's unbound and implements virtual mode. I'm initiating my queries in real-time and having performance issues when the user scrolls to render data to new rows. My winForm freezes and my memory keeps growing with each scroll/query and cpu usage is near 50%. Here's a code example. What am I doing wrong here?
class MyForm : Form
{
DataGridView dgv = new DataGridView();
DataRetriever dataretriever = new DataRetriever();
public MyForm()
{
dgv.AllowUserToAddRows = false;
dgv.AllowUserToDeleteRows = false;
dgv.ReadOnly = false;
dgv.VirtualMode = true;
dvg.Columns.Add("colID","ID");
dvg.Columns.Add("colVal","Val");
dgv.AddRows.Add();
dgv.Rows.Copies(0,300000);
dgv.CellValueNeeded += dgv_CellValueNeeded;
}
void Button1_Click(object sender, EventArgs e)
{
dataretriever.LoadData();
grid.Refresh();
}
void dgv_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
MyData mydata = dataretriever.GetRow(e.RowIndex);
while(mydata == null)
{
mydata.LoadData();
mydata = dataretriever.GetData(e.RowIndex);
}
switch(dgv.Columns[e.ColumnIndex].Name)
{
case "colID":
e.Value = mydata.id;
case "colVal":
e.Value = mydata.val;
}
}
class DataRetriever
{
string connStr = null;
SQLConn conn = null;
SQLCommand cmd = null;
SQLDataReader rdr = null;
int lastrow = 0;
Dictionary<int, MyData> cache = new Dictionary<int, MyData>();
public MyData GetData(int row)
{
if (row < 0)
return;
if (cache.ContainsKey(row))
{
return cache[row];
}
else
{
return null;
}
}
public int LoadData()
{
fetch();
return lastrow;
}
private void fetch()
{
conn = new SQLConn(connStr);
cmd = new SQLCommand();
cmd.Connection = conn;
try
{
conn.Open();
// SQL
string sql = "SELECT tbl1.ID, tbl2.Name, tbl2.Date, etc..." +
"FROM table1 tbl1 JOIN table2 tbl2, etc..." +
"ON tbl1._id = tbl2.id, WHERE..."
// user filters based on GUI settings
if(textbox1.Text > 0)
{
sql += "AND tbl1.whatever = " + textbox1.Text;
}
// more filtering based on user input into GUI
sql += "LIMIT 100 OFFSET " + lastrow;
cmd.CommandText = sql;
rdr = cmd.ExecuteReader();
while(rdr.Read())
{
int id = rdr["ID"];
int val = rdr["Val"];
cache.Add(lastrow, new MyData(id,val));
++lastrow;
}
rdr.Close();
}
catch(Exception ex)
{
}
finally
{
conn.Close();
cmd.Close();
}
}
}
class MyData
{
public int ID;
public int Val;
public MyData(int id, int val)
{
ID = id;
Val = val;
}
}
推荐答案
while(mydata == null)
{
mydata.LoadData();
mydata = dataretriever.GetData(e.RowIndex);
}
这篇关于dataGridView虚拟模式的性能问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文