C#&SQL:如何在不刷新DataGridView的情况下更新表?

我总是用

DataGridView.DataSource = (DataTable)tbl; 

但是这个方法完全刷新了Datagridview,比如selectrows,滚动条位置,backColor等。我只想更新来自SQL的单元数据以及完整的datagridview刷新

例如,uTorrent有一个像datagridview的表,在某些单元格中,x KB / s值总是刷新,但torrentdatagrid是静态的。 没有滚动移动,没有选择消失等。

你能帮帮我吗?

我很抱歉我的英语不好。 谢谢。

如果您的表具有主键,并且您只想更新现有/添加新行,则可以使用DataTable.Merge方法,如下所示:

原来

 dataGridView.DataSource = initial_data_table; 

更新

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

更新:上面的方法是最简单的,但正如评论中所提到的,它有副作用,因为Merge方法优化在操作期间抑制更改通知并在结尾处使用ListChangedType.Reset引发ListChanged事件。 因此,基于DataTable.LoadDataRow方法 ,这是一个简单而有效的方法 。

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

并提供一个certificate:

 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; } } } 

也许我懒得解释问题。 对不起。 但是,这段代码解决了我的问题,

  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。 谢谢