3

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

3 回答 3

1

问题是,即使数据没有更改,您也会更新表单。相反,尝试从 SQL Server 听到事件,例如,当有新数据时使用 SqlDependency (当然,如果您的数据不经常更改)。

于 2013-04-02T09:15:31.220 回答
0

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

control.DoubleBuffered = true;

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

和这个...

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

于 2013-04-02T07:18:41.113 回答
0

使用扩展方法为数据网格添加双缓冲,然后在表单中将其设置为 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);
    }
}

将上述类添加到您的项目中并为数据网格设置双缓冲属性,如下所示

dataGridView1.DoubleBuffered(true);

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

于 2013-04-02T10:18:38.437 回答