更新datagridview的最佳方法是什么?

时间:2013-04-02 07:14:19

标签: c# datagridview screen

我使用下面的代码在我的应用程序中使用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();

3 个答案:

答案 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