2013-04-02 44 views
3

我使用下面的代码来更新Timmer的应用程序中的datagridview。 Timmer每秒运行一次,屏幕闪烁。我该如何改变不闪光?或另一种方式来更新datagridview?什么是更新datagridview的最佳方式?

 SqlConnection mySqlConnection = new SqlConnection(SQLCONN); 
     mySqlConnection.Open(); 

     SqlDataAdapter addapter = new SqlDataAdapter(); 
     DataTable dt = new DataTable("SSReportAmalgamate"); 
     SqlCommand cmd = mySqlConnection.CreateCommand(); 

     cmd.CommandText = "EXEC App_GetDATA " + "@acc" + "," + "@selecttype"; 
     cmd.Parameters.Add("@acc", SqlDbType.Char).Value = acc; 
     cmd.Parameters.Add("@selecttype", SqlDbType.Char).Value = type; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = mySqlConnection; 
     addapter.SelectCommand = cmd; 

     addapter.Fill(dt); 
     dataGridView1.DataSource = dt; 

     mySqlConnection.Close(); 

回答

0

假设您使用WinForms,一种方法是将控件设置为double buffer

control.DoubleBuffered = true; 

或者您可以通过设计视图中的属性窗口设置;表格本身也有这个属性,IIRC。

这...

[...]可减少或消除由渐进 重绘显示的表面的部分而引起的闪烁。缓冲图形需要 更新的图形数据首先写入缓冲区。然后将图形缓冲区中的数据 快速写入显示表面 内存。显示的图形存储器的相对快速的切换典型地减少否则可能发生的闪烁。

+0

还是一样的。实际上,它不会闪烁整个屏幕,而且它只是运行应用程序时的datagridview部分,并且它是由于计时器设置为每隔一段时间运行一次。在datagridview中,我根据数据值更改单元格颜色。因此,一旦datagridview绑定,它会将原始单元格颜色更改为新的单元格颜色。 – Jay

1

问题是,即使数据未被更改,您也更新表单。相反,尝试听到来自SQL Server的事件,例如using a SqlDependency当有新的数据时(当然,如果你的数据不经常改变)。

+0

我无法使用SqlDependency,因为应用程序对“CREATE”没有足够的数据库权限。我可以知道另一种方式吗? – Jay

+0

我在事件(dataGridView_CellPainting)中添加了新函数,并通过循环每行并检查每个单元格值并更改单元格的前景色并解决问题。感谢您的回答。 :) – Jay

+0

创建什么?您唯一需要的是启用Service Broker(请询问您的数据库管理员“ALTER DATABASE yourDB SET ENABLE_BROKER”)。祝你好运! – alex555

0

使用扩展方法为datagrid添加双缓冲,稍后在您的表单中将其设置为true。

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

添加上面的类到您的项目,并设置双缓冲属性为DataGrid,这样

dataGridView1.DoubleBuffered(true); 

参考:http://bitmatic.com/c/fixing-a-slow-scrolling-datagridview

相关问题