2015-10-16 57 views
1

我總是用C#&SQL:如何更新表而無需刷新DataGridView?

DataGridView.DataSource = (DataTable)tbl; 

但是這種方法是完全refresing在DataGridView像selectedrows,滾動條位置,背景色等等。我只想從SQL更新單元格數據witouth全datagridview的刷新

對於示例uTorrent有一個類似datagridview的表,並且在某些單元格中,x KB/s值始終可以刷新,但torrentdatagrid是靜態的。有沒有滾動移動,沒有選擇消失等

你能幫我做到這一點?

對不起我的英文不好。謝謝。

+0

當然你可以遍歷行和列並設置新的值。但爲什麼不僅保存datagridview的選定索引,並在設置數據源後重新選擇它? –

+0

#Reza Aghaei,因爲如果我像你說的那樣做的話,屏幕上會出現一些類似於(在數據源刷新後)滾動滾動到表頂部並且當重新選擇執行滾動位置再次改變時。當這些令人高興時,用戶會看到所有的操作。我的事,是的,它會工作,但這是不好的事情。 –

+0

那麼如果某些記錄從數據源中刪除或添加到數據源呢? –

回答

1

如果你的表中有一個主鍵,你只想更新現有/添加新行,你可以使用DataTable.Merge Method這樣的:

最初

dataGridView.DataSource = initial_data_table; 

更新

((DataTable)dataGridView.DataSource).Merge(new_data_table); 

更新:上面的方法是最簡單的,但正如評論中提到的那樣,它有副作用,歸因於Merge方法優化,其在操作期間抑制改變通知並在末尾提高ListChanged事件與ListChangedType.Reset。所以,這裏是一個簡單而有效的方法是卓有成效的,基於DataTable.LoadDataRow Method

foreach (var dataRow in newTable.AsEnumerable()) 
    table.LoadDataRow(dataRow.ItemArray, LoadOption.OverwriteChanges); 

而且證明了一個例子:

using System; 
using System.Data; 
using System.Linq; 
using System.Windows.Forms; 

namespace Samples 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      var form = new Form(); 
      var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form }; 
      var data = GetData(); 
      dg.DataSource = data; 
      var updateTimer = new Timer { Interval = 200, Enabled = true }; 
      updateTimer.Tick += (sender, e) => 
      { 
       foreach (var dr in GetData().AsEnumerable()) 
        data.LoadDataRow(dr.ItemArray, LoadOption.OverwriteChanges); 
      }; 
      Application.Run(form); 
     } 
     static DataTable GetData() 
     { 
      var dt = new DataTable(); 
      dt.Columns.Add("Id", typeof(int)); 
      dt.Columns.Add("Name"); 
      dt.Columns.Add("Score", typeof(int)); 
      dt.PrimaryKey = new[] { dt.Columns["Id"] }; 
      var random = new Random(); 
      for (int i = 1; i <= 1000; i++) 
       dt.Rows.Add(i, "Player #" + i, random.Next(1, 100000)); 
      return dt; 
     } 
    } 
} 
+0

它重置網格滾動位置和所選記錄。它刷新網格。 –

+0

是的,它刷新網格。 –

+0

@RezaAghaei我的測試顯示只有水平滾動位置被重置。垂直滾動位置和選定記錄不受影響。 –

0

也許我苦幹來解釋問題。對不起。但是,這段代碼解決了我的問題,

  for (int i = 0; i < dg.Rows.Count; i++) 
      { 
       for (int j = 1; j < dg.Columns.Count ; j++) 
       { 
        dg.Rows[i].Cells[j].Value = NewDataTable.Select("ID=" + dg.Rows[i].Cells[0].Value)[0][j].ToString(); 
       } 
      } 

第一列是ID主鍵列。我通過定時器更新並實時將數據傳遞到我的datagridview。謝謝

+0

這和我的代碼一樣,你用過簡單的循環,而我使用linq。 –

+0

是的。我在Linq不太好。但我也試過你的代碼。我會找到結果。但是要求Reza如此之多 –

+0

這個解決方案對只讀列有問題,對於重新排序的列也會有問題,當一列表格不在網格中時也會出現問題,而我的文章涵蓋了這些問題。 –