Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新datagridview的最佳方式是什么?_C#_Datagridview_Screen - Fatal编程技术网

C# 更新datagridview的最佳方式是什么?

C# 更新datagridview的最佳方式是什么?,c#,datagridview,screen,C#,Datagridview,Screen,我使用下面的代码在我的应用程序中使用Timmer更新datagridview。Timmer每秒钟运行一次,并使屏幕保持闪烁。我怎样才能更改为此时不闪烁?还是另一种更新datagridview的方法 SqlConnection mySqlConnection = new SqlConnection(SQLCONN); mySqlConnection.Open(); SqlDataAdapter addapter = new SqlDataAdapt

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

假设您使用的是WinForms,一个操作过程是将控件设置为

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

而这个

[…]可以减少或消除由渐进式 重新绘制显示曲面的零件。缓冲图形需要 更新后的图形数据首先写入缓冲区。数据 然后在图形缓冲区中快速写入显示的曲面 记忆。显示图形内存的相对快速切换 通常会减少可能发生的闪烁


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

使用扩展方法为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);

参考资料:

仍然相同。事实上,在运行应用程序时,它并没有在整个屏幕上闪烁,它只是datagridview的一部分,这是因为计时器设置为每隔一天运行一次。在datagridview中,我根据数据值更改单元格颜色。因此,一旦datagridview绑定,它会将原始单元格颜色更改为新的单元格颜色。我不能使用SqlDependency,因为应用程序没有足够的“创建”db权限。我可以知道另一种方法吗?我在event(dataGridView_CellPaint)中添加了新函数,通过循环每行检查每个单元格的值,并更改单元格的前景色,从而解决了问题。谢谢你的回答。:)创造什么?您只需要启用ServiceBroker(请向DB管理员咨询
ALTER DATABASE yourDB SET enable\u Broker
)。祝你好运
dataGridView1.DoubleBuffered(true);