Если таблица имеет первичный ключ, и вы хотите только обновить существующий/добавить новые строки, вы можете использовать DataTable.Merge Method так:
Первоначально
dataGridView.DataSource = initial_data_table;
Update
((DataTable)dataGridView.DataSource).Merge(new_data_table);
UPDATE: Метод выше прост, но, как упоминалось в комментариях, он имеет побочные эффекты из-за 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, потому что, если я это сделаю, как вы говорите, некоторые действия на экране выглядят примерно так (после обновления данных datasource :) прокрутка вверх по вершине таблицы и при повторном выборе выполнения позиции прокрутки снова меняется. Когда это происходит, пользователи видят все действия. Я, Да, это будет работать, но это плохо. –
Так что, если некоторые записи удалены или добавлены в источник данных? –