dataGridView虚拟模式的性能问题 [英] Performance issues with dataGridView Virtual Mode

查看:106
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆