2013-04-02 42 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

相關問題