我使用下面的代码在我的应用程序中使用Timmer更新datagridview。 Timmer每隔一秒运行一次,它会让屏幕闪烁。我怎么能不改变当时的闪光?或者更新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 :(得分:1)
问题是,即使数据没有更改,您也要更新表单。相反,尝试听取SQL Server中的事件,例如当有新数据时using a SqlDependency(当然,如果您的数据不经常更改)。
答案 1 :(得分:0)
假设您正在使用WinForms,一种操作方法是将控件设置为double buffer。
control.DoubleBuffered = true;
或者您可以通过“设计”视图中的“属性”窗口进行设置;表格本身也有这个属性,IIRC。
这就是......
[...]可以减少或消除由渐进引起的闪烁 重绘显示表面的部分。缓冲图形需要 更新的图形数据首先写入缓冲区。数据 然后在图形缓冲区中快速写入显示的表面 记忆。显示图形内存的相对快速切换 通常会减少可能发生的闪烁。
答案 2 :(得分: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设置double buffered属性,如此
dataGridView1.DoubleBuffered(true);
参考:http://bitmatic.com/c/fixing-a-slow-scrolling-datagridview