如果你的表中有一個主鍵,你只想更新現有/添加新行,你可以使用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;
}
}
}
當然你可以遍歷行和列並設置新的值。但爲什麼不僅保存datagridview的選定索引,並在設置數據源後重新選擇它? –
#Reza Aghaei,因爲如果我像你說的那樣做的話,屏幕上會出現一些類似於(在數據源刷新後)滾動滾動到表頂部並且當重新選擇執行滾動位置再次改變時。當這些令人高興時,用戶會看到所有的操作。我的事,是的,它會工作,但這是不好的事情。 –
那麼如果某些記錄從數據源中刪除或添加到數據源呢? –